删除除根节点之外的所有节点中的XML命名空间

时间:2017-05-19 11:42:29

标签: xml xslt xml-namespaces

我想删除所有节点中的命名空间,但是在根节点中保留命名空间。

你知道我该怎么办?

我正在使用这个XSLT,但它正在删除所有节点中的命名空间。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="xml" version="1.0" encoding="UTF-8" />
  <xsl:template match="*">
    <xsl:element name="{local-name()}" >
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

提前致谢。

2 个答案:

答案 0 :(得分:2)

将元素保留在其命名空间中的简单方法是复制

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

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

<!-- keep namespace of root element -->
<xsl:template match="/*">
    <xsl:copy>
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

请注意,这不会处理属性(您的版本也不会)。

答案 1 :(得分:-1)

你的第一种方法似乎很适合我。你只需要:

  • 添加模板以匹配根节点,该节点不会删除命名空间:

<xsl:template match="/*"> <xsl:element name="{name()}" > <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:template>

  • 在XSL中包含根命名空间定义:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:rootns="..." >