如何从子元素中剥离本地命名空间

时间:2018-04-17 10:11:22

标签: xml xslt

我有这个XSL,它可以很好地从元素中删除属性以生成最终的xml文档。但是,有些元素包含本地名称空间,Id也喜欢删除它们。这是我目前的XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

XML可能看起来像这样

    <?xml version="1.0" encoding="UTF-8"?>
<document>
       <node1>
            <node2 xmlns="www.xml.com">
                   <object>cars</object>
                   <object>boat</object>
            </node2>
       </node1>
</document>

我希望最终文件不包含xmlns =&#34; www.xml.com&#34;

1 个答案:

答案 0 :(得分:1)

您可以使用local-name()功能获取当前节点的名称。

使用它,您可以创建一个新元素,并为该元素提供原始元素的名称,而不是复制现有元素(以及它的命名空间)。

您还需要修改匹配语句,以确保您只捕获实际元素;即文本节点之类的东西仍然算作节点,但不会有本地名称;因此,使用element()代替node()可确保您只捕获(命名)元素。

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="element()">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

XSLT小提琴:http://xsltfiddle.liberty-development.net/pPqsHT3