0

我正在使用 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>
4

1 回答 1

1

请注意,ns1 命名空间已附加到有效负载节点中的各个节点。在大多数情况下,这很好,但是我需要更早地发生该声明,即在根节点上,因为它使有效负载节点上的 xsi:type 定义无效,因为此时序列化程序不知道 ns1 命名空间,这会阻止正确解析下游。

我能做些什么来强制这个命名空间早一点输出?

您可以做一些非常简单的事情:向我们展示您的代码

您关于“简单副本”丢失顶部节点的命名空间之一的说法对于以下两个“简单副本”不正确:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时

<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>

结果是相同的

<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>

这是第二个“简单副本”:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

结果再次与源 XML 文档相同

于 2010-10-12T01:54:44.300 回答