XSLT - 忽略/删除子节点中的空命名空间



为了能够拥有一个具有动态命名空间值的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节点没有命名空间?

通常,原则是:如果将元素放在正确的命名空间中,命名空间声明将自行处理。对子元素具有xmlns=""声明的原因是,您将子元素创建为无命名空间元素。

(如果你想在答案中输入实际代码,那么在问题中放一些代码。特别是,你的标题谈到了动态设置命名空间,但你还没有解释它是否真的需要动态)。

这两个元素具有不同的命名空间值。不使用命名空间前缀时,需要xmlns命名空间绑定属性才能表示这些元素的命名空间值。

名为root的元素绑定到命名空间MyNS,名为child的元素位于"no 命名空间"中并且没有。

由于父元素绑定到命名空间并且不使用命名空间前缀,因此它的子元素(没有命名空间)将具有空命名空间声明。xmlns命名空间声明属性的存在是为了指示命名空间是什么(或指示它没有命名空间)。

否则,如果您的 XML 是:

<root xmlns="MyNS">
<child />
</root>

元素将绑定到">MyNS">命名空间。它相当于:

<m:root xmlns:m="MyNS">
<m:child/>
</m:root>

如果名为 root 的元素具有命名空间前缀,则可以具有输出,其中名为root的元素绑定到MyNS命名空间,而名为child的元素没有命名空间,并且不需要空命名空间声明xmlns=""

<m:root xmlns:m="MyNS">
<child/>
</m:root>

最新更新