我有一個XML文檔是這樣的:獲取所有<PRO>標籤都有效在不同層
<PUB>
<PGR>
<PGR>
<PGR>
<PRO>
<PRO>
<PRO>
</PGR>
<PRO>
<PRO>
....
所以PRO標籤在不同的層,但我想訪問所有PRO標籤。 我該怎麼做?
我有一個XML文檔是這樣的:獲取所有<PRO>標籤都有效在不同層
<PUB>
<PGR>
<PGR>
<PGR>
<PRO>
<PRO>
<PRO>
</PGR>
<PRO>
<PRO>
....
所以PRO標籤在不同的層,但我想訪問所有PRO標籤。 我該怎麼做?
因爲這個問題被標記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元素無論當前節點是。
<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> </xsl:text>
</xsl:template>
</xsl:stylesheet>
中的XPath僞操作''//'不是'descendant ::'的「同義詞」。請閱讀W3C XPath 1.0建議書中的確切定義,然後更正您的答案。 –
@Dimitre,我刪除了這個陳述,那是因爲正確的解釋是在你的回答中:-) –
使用此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>
你知不知道'match =「// PRO」'相當於'match =「PRO」'?此外,沒有任何保證,第一個提供的替代品將被選中 - 你還沒有提供完整的代碼。同樣,在較小程度上適用於你的第二種選擇。始終提供完整的解決方 –
@Dimitre我明白了,看起來很明顯的問題並非如此:D;我試圖改進我的答案。謝謝 –
現在它更好:) –