我需要生成以下输出:
<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>