为了能够拥有带有动态命名空间值的root
元素,我将其从:<Foo xmlns="HardCodedXMLNS">
切换为:
<xsl:element name="Foo" namespace="{Table/Foo_Dynamic_XMLNS}">
当前的XSLT如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" />
<xsl:template match="/NewDataSet">
<xsl:element name="Foo" namespace="{Table/Foo_xmlns}">
<Bar Id ="{Table/Bar_Id}">
</Bar>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
现在问题是<Bar>
元素在转换后获得一个空名称空间,如(当前输出):
<Foo xmlns="http://MyDynamicValue">
<Bar xmlns="">
</Bar>
</Foo>
预期输出:
<Foo xmlns="http://MyDynamicValue">
<Bar>
</Bar>
</Foo>
问题:如何解决此问题,以便Bar
节点没有命名空间?
答案 0 :(得分:2)
通常,原则是:如果将元素放在正确的命名空间中,则命名空间声明将自行处理。您对子项进行xmlns=""
声明的原因是您将子元素创建为无命名空间元素。
(如果您想在答案中使用实际代码,那么请在问题中添加一些代码。特别是,您的标题会讨论动态设置命名空间,但您还没有解释它是否真的需要是动态的。)
答案 1 :(得分:1)
您的两个元素都有不同的命名空间值。如果不使用名称空间前缀,则需要xmlns
名称空间绑定属性才能表示这些元素的名称空间值。
名为 root 的元素绑定到命名空间 MyNS ,名为 child 的元素位于&#34; no命名空间&#34 ;没有。
由于父元素绑定到命名空间并且不使用命名空间前缀,因此它的子元素(没有命名空间)将具有空命名空间声明。 xmlns 命名空间声明属性用于指示命名空间是什么(或表示它没有)。
否则,如果你的XML是:
<root xmlns="MyNS">
<child />
</root>
然后子元素将绑定到&#34; MyNS &#34;命名空间。它相当于:
<m:root xmlns:m="MyNS">
<m:child/>
</m:root>
如果名为 root 的元素具有名称空间前缀,那么您可以使用输出,其中名为 root 的元素绑定到 MyNS 名称空间和名为 child 的元素没有名称空间,不需要空名称空间声明xmlns=""
:
<m:root xmlns:m="MyNS">
<child/>
</m:root>