我正在使用xsl脚本从xml的所有部分删除注释。它实际上删除了父节点中的注释,但没有删除其他内部节点中的注释。
[编辑]
更新问题。我的要求是从整个XML文档中删除所有注释。
答案 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处理器?