删除特定元素的命名空间

时间:2010-12-08 12:47:16

标签: xslt

有没有办法删除特定元素的命名空间?

2 个答案:

答案 0 :(得分:7)

此转化

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

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

 <xsl:template match="x:*">
  <xsl:element name="{local-name()}">
    <xsl:copy-of select="namespace::*[not(. = namespace-uri(..))]"/>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

"my:x"命名空间中删除任何元素,并将其置于“无命名空间”。

例如,当应用于以下XML文档时:

<t>
  <x:a  xmlns:x="my:x"/>
</t>

产生了想要的正确结果

<t>
   <a/>
</t>

要仅删除特定命名空间中的特定元素,必须使覆盖身份规则的模板更具体,以便仅匹配所需元素

答案 1 :(得分:0)

您的XSLT输出是一个新对象(节点或文本),您可以将每个元素复制或转换为没有命名空间的新元素。假设您的输入使用命名空间“http://www.foo/”。您可以在没有命名空间的情况下创建相同名称的元素(可能还有相同的子元素)。

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

<!-- other elements and root omitted -->

    <xsl:template match="h:table">
      <table>
        <!-- copy or transform attributes and children -->
      </table>
    </xsl:table>

</xsl:stylesheet>

将使用默认命名空间创建一个新节点,该节点不需要前缀,我认为这就是您所需要的。 [可能有更优雅的方式使用xsl:copy ... -

更新:......并且@Dmitri已经展示了它们!