xsl:namespace-别名在使用 xsl:copy-of 时无法按预期工作

xsl:namespace-alias does not work as expected while using xsl:copy-of

我有一个要求,我必须从请求有效负载中删除 soap 信封,并将 parent 标记的命名空间从命名空间 "random.com/system/i/Modify/1.0" 更改为 "http://random.com/G/Modify",请求 header 从命名空间 "http://random.com/2/MsgHeader/""http://random.com/3/MsgHeader/" 并请求 body 命名空间 "http://random.com/2/MsgBody/""http://random.com/3/MsgBody/"

我不确定为什么 xsl:namespace-alias 无法正确更改名称空间

转换文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
version="3.0"
exclude-result-prefixes="soapenv"
xmlns:old="random.com/system/i/Modify/1.0/"
xmlns:gcp="http://random.com/G/Modify"
xmlns:ogcph="http://random.com/2/MsgHeader/"
xmlns:hgcph="http://random.com/3/MsgHeader/"
xmlns:ogcpb="http://random.com/2/MsgBody/"
xmlns:hgcpb="http://random.com/3/MsgBody/">


<xsl:namespace-alias stylesheet-prefix="soapenv" result-prefix="#default"/> 
<xsl:namespace-alias stylesheet-prefix="old"     result-prefix="gcp"/>
<xsl:namespace-alias stylesheet-prefix="ogcph"    result-prefix="hgcph"/>
<xsl:namespace-alias stylesheet-prefix="ogcpb"    result-prefix="hgcpb"/>

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="*">
  <gcp:Modifys>  
    <gcp:Modify>
        <xsl:copy-of copy-namespaces="no" select="/*:Envelope/*:Body/*:Modifys/*:Modify/*"/>
    </gcp:Modify>
  </gcp:Modifys>
</xsl:template>
</xsl:stylesheet>   

你在这里问了同样的问题:https://saxonica.plan.io/issues/4817

这是我的回答:

如果您阅读 xsl:namespace-alias 的规范,您会发现它只影响文字结果元素。 如果要复制名称空间发生变化的元素,请使用模板规则,例如

<xsl:template match=xyz:"*">
  <xsl:element name="{local-name()}" namespace="http://new-namespace/">
     <xsl:apply-templates select="@*, node()"/>
  </xsl:element>
</xsl:template>

请不要在几个不同的论坛上问同一个问题,从而为人们付出额外的努力。