使用XSLT1.0输出多个命名空间定义



我需要生成以下输出:

<x:Envelope xmlns:x='namespace1'>
<x:Root xmlns="namespace2">
<Header>
...
</Header>
</x:Root>
</x:Envelope>

我在使用xslt 1.0为x:Root元素生成默认名称空间时遇到问题。我可以让它没有名称空间(但名称空间2将在根的子代上指定-不希望的行为),或者用前缀:

<x:Root xmlns:x="namespace2"> 

但这无法通过模式验证。有什么想法吗?

编辑:很抱歉有模棱两可的问题,谢谢你的回答。根应在namespace1中,头应在namesspace2中。但是,请求是namespace2不应在Header中声明,而应在Root级别声明。

问候,

这取决于有多少是静态已知的。如果您静态地了解所有内容,则文字结果元素

<x:Root xmlns="namespace2">..</x:Root>

会产生你想要的东西。在更常见的情况下,您需要构建一个包含所需名称空间节点的元素,然后复制名称空间节点:

<xsl:param name="ns">namespace2</xsl:param>
<xsl:variable name="temp">
  <xsl:element name="dummy" namespace="{$ns}"/>
</xsl:variable>
...
<xsl:element name="Root">
  <xsl:copy-of select="xx:node-set($temp)/namespace::*"/>
</xsl:element>

有了xsl:namespace指令,XSLT2.0中的一切都变得容易多了。

不能将两个不同的名称空间映射到相同的前缀"x"。相反,去掉Root的前缀,如下所示:

<Root xmlns="namespace2">
...
</Root>

相关内容

  • 没有找到相关文章

最新更新