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>
请不要在几个不同的论坛上问同一个问题,从而为人们付出额外的努力。
我有一个要求,我必须从请求有效负载中删除 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>
请不要在几个不同的论坛上问同一个问题,从而为人们付出额外的努力。