2011-10-13 55 views
7

我想刪除其中只包含空格/換行符/製表字符標籤,如下圖所示:的XPath/XSLT刪除空標籤

<p> </p> 

你將如何做到這一點使用XPath函數和XSLT模板?

+0

好問題,+1。使用最基本和最強大的XSLT設計模式可以正確地生成想要的結果 - 覆蓋身份規則。 –

回答

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 in他的評論建議此溶液的一些位需要進一步解釋:

對於外行或好奇:not(*)裝置:不具有子 元件; not(text()[normalize-space()])意思是:沒有文本節點 而且只有非空白的文本。

+4

對於不熟悉的或好奇的:'not(*)'表示:沒有子元素; 'not(text()[normalize-space()])意味着:沒有帶文本的文本節點。 – Abel

+0

@Abel:謝謝,我會在答案中解釋這一點。 –

+1

太好了,謝謝Dimitre。我仍然是一個XSLT的初學者,我一直在做這樣的事情,讓我們走了。我想我需要找一本好書。再次感謝真棒解釋,SO需要更多的這一點。 – Kyle