xsl从所有节点中删除注释

时间:2010-09-14 15:10:12

标签: xml xslt

我正在使用xsl脚本从xml的所有部分删除注释。它实际上删除了父节点中的注释,但没有删除其他内部节点中的注释。

[编辑]

更新问题。我的要求是从整个XML文档中删除所有注释。

2 个答案:

答案 0 :(得分:8)

此转化

<xsl:stylesheet version="1.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()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
   </xsl:template>
   <xsl:template match="comment()"/>
</xsl:stylesheet>

应用于包含评论节点的任何XML文档时,例如

<!-- foo -->
<a>
   <!-- bar -->
   <b>
      <c><!-- baz --></c>
   </b>
</a>

生成想要的结果(剥离注释节点的同一文档):

<a>
    <b>
        <c/>
    </b>
</a>

请注意:使用最基本和最强大的XSLT设计模式 - 使用和覆盖身份规则。

答案 1 :(得分:3)

听起来您只想复制来自输入XML的注释。而且你说你的样式表复制了某些评论而不是其他评论?当你说“父节点中的注释”时,你的意思是作为根节点的子节点的注释(即在所有元素之外)吗?

当我尝试这个样式表时,它工作正常。特别是XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="/">
      <comments>
         <xsl:for-each select="//comment()">
            <comment><xsl:value-of select="."/></comment>
         </xsl:for-each>
      </comments>
   </xsl:template>
</xsl:stylesheet>

针对输入

运行
<?xml version="1.0" encoding="UTF-8"?>
<!-- foo -->
<a>
   <!-- bar -->
   <b>
      <c><!-- baz --></c>
   </b>
</a>

给出输出

<?xml version="1.0" encoding="utf-8"?>
<comments>
   <comment> foo </comment>
   <comment> bar </comment>
   <comment> baz </comment>
</comments>

如果这不是您想要的行为,或者如果您的行为仍然无效,您是否可以发布整个样式表和输入XML样本,并显示当前输出是什么?您还在使用什么XSLT处理器?