這裏是如何做到這一點:
<!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>
這種技術可以推廣:
你可以擁有所有whetespace字符在一個xsl:變量,那麼只需重寫身份規則與此模板:
<!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,'') != ''"/>
@Franci佩諾夫,感謝你的更正。 – Kalinin 2010-04-01 08:42:22
但他沒有糾正你畸形的XML文件! – 2010-04-01 12:59:00
好問題(+1)。查看我的解決方案以獲得答案。此外,永遠不會發布畸形的XML文檔。這是邪惡的。 – 2010-04-01 13:00:16