使用XSLT 1.0输出多个名称空间定义

时间:2013-08-20 20:46:48

标签: xslt namespaces xslt-1.0 prefix

我需要生成以下输出:

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

我在使用xslt 1.0生成x:Root元素的默认命名空间时遇到问题。我可以让它没有命名空间(但是将在root的子项上指定namespace2 - 不受欢迎的行为)或者使用前缀:

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

但这无法进行架构验证。有什么想法吗?

编辑:抱歉这个含糊不清的问题并感谢您的回答。 Root应位于namespace1中,Header应位于namespace2中。但是,请求是不应该在Header中声明namespace2,而是在Root级别声明。

此致

2 个答案:

答案 0 :(得分:0)

这取决于静态知道多少。如果您静态地知道所有内容,那么文字结果元素

<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指令在XSLT 2.0中更容易。

答案 1 :(得分:-1)

您无法将两个不同的名称空间映射到相同的前缀&#34; x&#34;。相反,请将Root的前缀全部放在一起,如下所示:

<Root xmlns="namespace2">
...
</Root>
相关问题