我需要了解如何检测节点是否包含重要信息。
以下示例显示了不被我视为“重要”信息的内容:
<node>
<node1> </node1>
</br></br>
<node1>
<node2></br> </node2>
</br></br>
</node1>
<!--
and so on...
-->
</node>
这个<node>
对我来说是空。
答案 0 :(得分:1)
以下是如何操作:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"text()
[translate(normalize-space(), ' ','')
= ''
]"/>
</xsl:stylesheet>
当此转换应用于以下XML文档时(您提供的那个文档严重格式错误 - 在很多方面都没有很好地形成!!):
<!DOCTYPE node [ <!ENTITY nbsp " "> ]>
<node>
<node1> </node1>
<br></br>
<node1>
<node2><br/> </node2>
<br></br>
</node1>
<!--
and so on...
-->
</node>
然后生成想要的结果:
<node>
<node1/>
<br/>
<node1>
<node2>
<br/>
</node2>
<br/>
</node1><!--
and so on...
-->
</node>
此技术可以推广:
您可以在xsl:变量中包含所有whetespace字符,然后只需使用此模板覆盖标识规则:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vwhiteSpace" select="' 	

 '"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:if test="translate(., $vwhiteSpace,'') != ''">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
您可以在$vwhiteSpace
更新:OP在评论中指出他实际上想要查看“节点”是否重要 - 不是“清理节点”。
对此的解决方案已包含在我对初始问题的解决方案中:
<xsl:variable name="vIsSignificant" select=
"translate(., $vwhiteSpace,'') != ''"/>