2

我需要生成以下输出:

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

我无法使用 xslt 1.0 为 x:Root 元素生成默认命名空间。我可以让它没有命名空间(但命名空间 2 将在 root 的不受欢迎行为的孩子上指定)或带有前缀:

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

但这无法通过架构验证。有任何想法吗 ?

编辑:抱歉这个模棱两可的问题,感谢您的回答。Root 应该在 namespace1 中,Header 应该在 namespace2 中。但是,请求是不应在 Header 中声明 namespace2,而应在 Root 级别声明。

问候,

4

2 回答 2

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>

在 XSLT 2.0 中,使用 xsl:namespace 指令使这一切变得容易得多。

于 2013-08-21T08:40:15.757 回答
-1

您不能将两个不同的命名空间映射到同一个前缀“x”。相反,将 Root 的前缀全部去掉,如下所示:

<Root xmlns="namespace2">
...
</Root>
于 2013-08-20T21:35:49.787 回答