我想删除仅包含空格/换行符/标签字符的标签,如下所示:
<p> </p>
如何使用xpath函数和xslt模板执行此操作?
答案 0 :(得分:10)
此转换(覆盖identity rule):
<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()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(*) and not(text()[normalize-space()])]"/>
</xsl:stylesheet>
应用于以下XML文档:
<t>
<a>
<b>
<c/>
</b>
</a>
<p></p>
<p> </p>
<p>Text</p>
</t>
正确生成想要的结果:
<t>
<a>
<b/>
</a>
<p>Text</p>
</t>
记住:使用和覆盖身份规则/模板是最基本和最强大的XSLT设计模式。它是各种问题的正确选择,其中大多数节点将被保持不变,只需要更改,删除,重命名,等等一些特定节点。
注意:@Abel在他的评论中建议需要进一步解释此解决方案的一些内容:
对于不熟悉或好奇:
not(*)
意味着:没有孩子 元件;not(text()[normalize-space()])
表示:没有文本节点 只有非白色空格的文字。