我正在使用 XSLT 1.0 来转换一些 XML。
我不太确定解释这一点的最佳方法,因此将使用一些示例。
我的输入 XML 包含一个特化,使用 xsi:type 声明。查看负载节点:
<ns0:RootNode xmlns:ns0="namespace1" xmlns:ns1="namespace2" xmlns:xsi="http://www.w3.org/2001/XMLSchema">
<ns0:Payload xsi:type="ns1:SpecialPayload">
<ns1:InnerNode>Hello</ns1:InnerNode>
</ns0:Payload>
</ns0:RootNode>
当我通过我的 XSLT 发送它时(让我们假设一个 1 对 1 的副本),我得到以下输出
<ns0:RootNode xmlns:ns0="namespace1" xmlns:xsi="http://www.w3.org/2001/XMLSchema">
<ns0:Payload xsi:type="ns1:SpecialPayload">
<ns1:InnerNode xmlns:ns1="namespace2">Hello</ns1:InnerNode>
</ns0:Payload>
</ns0:RootNode>
请注意,ns1 命名空间已附加到有效负载节点中的各个节点。在大多数情况下这很好,但是我需要更早地进行该声明,即在根节点上,因为它使有效负载节点上的 xsi:type 定义无效,因为此时序列化程序不知道 ns1 命名空间,这会阻止正确解析下游。
我能做些什么来强制这个命名空间早一点输出?
编辑的 XSLT 代码:
<!-- Replace The ESBMessage node with the SOAP method -->
<xsl:template match="s1:ESBMessage" mode="copy">
<s0:SendESBMessage>
<s0:msg>
<xsl:apply-templates select="*" mode="copy"/>
</s0:msg>
</s0:SendESBMessage>
</xsl:template>
<!-- Generic Copy -->
<xsl:template match="*" mode="copy">
<xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates mode="copy"/>
</xsl:element>
</xsl:template>