2011-09-05 60 views

回答

4

因爲這個問題被標記XSLT,你可能想:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="/*"> 
     <xsl:apply-templates select=".//PRO"/> 
    </xsl:template> 

    <xsl:template match="PRO"> 
    <!-- enjoy PRO --> 
    </xsl:template> 

</xsl:stylesheet> 

注意,不同於正常情況下,在應用模板這裏使用的.相關。事實上,以這種方式,我們選擇從當前的匹配節點(PUB)開始的所有PRO元素,而:

<xsl:apply-templates select="//PRO"/> 

將應用模板從文檔根目錄匹配所有PRO元素無論當前節點是。

+1

你知不知道'match =「// PRO」'相當於'match =「PRO」'?此外,沒有任何保證,第一個提供的替代品將被選中 - 你還沒有提供完整的代碼。同樣,在較小程度上適用於你的第二種選擇。始終提供完整的解決方 –

+0

@Dimitre我明白了,看起來很明顯的問題並非如此:D;我試圖改進我的答案。謝謝 –

+1

現在它更好:) –

1
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="no"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="//PRO"/> 
    </xsl:template> 

    <xsl:template match="PRO"> 
     <xsl:value-of select="generate-id()"/> 
     <xsl:text>&#xA0;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

中的XPath僞操作''//'不是'descendant ::'的「同義詞」。請閱讀W3C XPath 1.0建議書中的確切定義,然後更正您的答案。 –

+0

@Dimitre,我刪除了這個陳述,那是因爲正確的解釋是在你的回答中:-) –

1

使用此XPath表達式

//PRO 

這個選擇被命名PRO XML文檔中的所有元素。

按照XPath 1.0 W3C Recommendation

//是短期的/descendant-or-self::node()/

因此,以上的XPath表達式是等效於長:

/descendant-or-self::node()/PRO

通常建議儘可能避免使用//僞操作符,因爲它會導致完整的XML文檔被掃描。只要有可能。儘可能多地使用上下文來構建更具體的XPath表達式,以便更有效地評估它。

/a/b/c 

使用它,並從不使用:

例如,如果在給定的XML文檔很清楚,有用元件c可以使用XPath表達式選定

//c 

的執行速度的差異有時會達到幾百或幾千倍。

或者,在XSLT使用模板,只是模式匹配 - 這可能是訪問和處理所有(只)PRO元素任何XML文檔在最短的轉型:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="PRO"> 
    <!-- Your code here --> 
</xsl:template> 

<xsl:template match="text()"/> 
</xsl:stylesheet>