gpt4 book ai didi

xml - XSLT 1.0 的命名空间输出导致问题

转载 作者:行者123 更新时间:2023-12-04 17:05:02 25 4
gpt4 key购买 nike

我正在使用 XSLT 1.0 来转换一些 XML。

我不太确定解释这一点的最佳方式,因此将使用一些示例。

我的输入 XML 包含一个特殊化,使用 xsi:type 声明。查看Payload节点:

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

最佳答案

Notice the ns1 namespace has been attached to the individual nodes within the payload node. In most cases this would be fine, however I need that declaration to happen earlier, i.e. on the root node, as it makes the xsi:type definition on the payload node invalid, because at this point the serializer does not know about the ns1 namespace, which prevents correct parsing downstream.

What can I do to force this namespace to be output a little earlier?



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

您关于“简单副本”丢失顶级节点的命名空间之一的说法不适用于以下两个“简单副本”:
<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 文档 相同.

关于xml - XSLT 1.0 的命名空间输出导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3910984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com