使用:
//table//td//text()[normalize-space()]
這將選擇任何非所有空白文本是一個td
即XML文檔的一個table
元件的後代的後代節點。
XSLT - 基於驗證:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:for-each select="//table//td//text()[normalize-space()]">
<xsl:copy-of select="."/>
=============
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
當該變換被應用所提供的XML文檔:
<table>
<tr>
<td>
<div id="somediv1">
<span>blablabla</span>
</div>
</td>
<td>
<div id="somediv2">
<span>text2</span>
</div>
<div id="somediv3">
<span>text3</span>
</div>
<span>text4</span>
</td>
</tr>
</table>
XPath表達式求值和所有選定的文本節點是複製到輸出,使用視覺上不同的分隔符字符串:
blablabla
=============
text2
=============
text3
=============
text4
=============
更新:
如果源XML文檔是在默認名稱空間,上述XPath表達式應當改變以考慮這樣一個事實:
//x:table//x:td//text()[normalize-space()
其中前綴"x"
綁定到源XML文檔的默認名稱空間。
下面是一個完整的例子,XSLT - 基於:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:x="http://www.w3.org/1999/xhtml">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:for-each select="//x:table//x:td//text()[normalize-space()]">
<xsl:copy-of select="."/>
=============
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
當應用在下面的XML文檔(提供一個這種轉變,但放在一個缺省值(XHTML)命名空間:
<table xmlns="http://www.w3.org/1999/xhtml">
<tr>
<td>
<div id="somediv1">
<span>blablabla</span>
</div>
</td>
<td>
<div id="somediv2">
<span>text2</span>
</div>
<div id="somediv3">
<span>text3</span>
</div>
<span>text4</span>
</td>
</tr>
</table>
再次同樣正確的結果產生:
blablabla
=============
text2
=============
text3
=============
text4
=============
類似於「// text()」的XPath可能是什麼? –
那麼,文本()返回空列表,這可能是因爲一切都在div或跨度 – Zed
甚至'//text()'返回一個空列表? –