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

时间:2018-04-16 23:21:50

标签: xml 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节点没有命名空间?

2 个答案:

答案 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>