2008-11-26 531 views
9

如果我有一個具有多個元素的文檔具有相同的名稱會怎麼樣?例如,我將如何檢索第二個元素?如何識別XPath中具有相同名稱的多個元素?

​​

我期望像// elem [@ name ='same'] [2]這樣的工作。

此外,我將如何找到最後一個元素XPath中的第二位元素的可變數量的同名

回答

17

[ ]具有更高的優先級比//(和「//」,其實只是一個縮寫,不是運營商)。之所以如此,是因爲根據XPath 1.0 Spec

「//是短期的/後代或自身::節點()/」

後來:

:該位置路徑//第1不等同於位置路徑/後代:第1。後者選擇第一個後代para元素;前者選擇所有後代para元素,它們是父母的第一個para孩子。

因此,XPath表達式:

        //element[@name='same'][2]

指:

選擇文檔中的任何元件,其被命名爲 「元件」,具有屬性 「名稱」 與價值「相同」,這個元素是其父母的第二個這樣的孩子。

你想要的是

        (//element[@name='same'])[2]

注意括號,其覆蓋的[]更高的優先級。

類似地,最後但一個這樣的節點由以下XPath表達式選自:

        (//element[@name='same'])[last()-1]

最後,一個必要的警告:使用的「 //「縮寫非常昂貴,因爲它會導致整個(子)樹遍歷。無論何時文檔的結構已知,建議使用更具體的構造(位置路徑)。

+2

+1,謝謝你爲什麼`/ para [1]`,也就是`/ descendant-or-self :: node()/ para [1]`和/ descendant :: para [1]`。回覆:「使用」//「的縮寫非常昂貴」 - 我會說「*可能*非常昂貴,但它很大程度上取決於處理器。」例如,撒克遜人對於優化非常聰明,AFAIU通常會自動構建密鑰,以便快速製作「//」表達式。 – LarsH 2010-10-19 02:41:50

相關問題