2012-02-10 76 views
1

考慮以下XML:的XPath 1.0:替換使用括號

<A> 
    <B /> 
</A> 
<A> 
    <B /> 
</A> 

有沒有辦法來避免使用這個XPath 1.0表達式括號獲得第二個B元素?

(/A/B)[2] 

如果使用/ A/B [2],空集被返回爲有任何A.下沒有第二個B我需要的是一些有關說明的XPath處理器來評價前述表達和應用對結果的預測。

我需要這個的原因是,在構建XPath表達式時,我不知道前面和後面的部分(即我無法放置開頭參數)。目前,我只知道我想將/ B添加到表達式中並將謂詞應用於結果。

回答

0

你應該使用這樣的:

//A/B[@id='2'] 
+0

不幸的是,在真實文檔中沒有這樣的標識。我在這裏使用它來輕鬆識別我需要選擇的元素。 – adostrian 2012-02-10 16:59:24

1

這個XML的格式不正確 - 它應該只有一個根。假設頂部有<R>

現在,您可以搜索/R/A[2]/B獲得第二B.但是,一旦你有,唯一可能的方式是包圍整個表達式在括號並添加B[2]。爲什麼在開頭放置括號是個問題?

+0

不,這是一個內在的部分,整個XML當然是很好的形成。 XPath表達式構造的方式我不知道表達式的其他部分,正如我在問題中已經提到的那樣。這就是爲什麼我試圖尋找其他東西而不是派生物。 – adostrian 2012-02-12 15:58:25

1

下仍然使用括號,但裏面只有謂詞過濾器的,所以你可以追加,當你正在構建你的XPath:

/A/B[count(.|(/A/B)[2])=1] 

它使用Kaysian technique的差集。如果當前節點相同,則當前節點的聯合計數和第二個節點的選擇將爲1。

+0

如果我知道表達式的前幾部分,我可以使用parantheses作爲一個更簡單的解決方案。 – adostrian 2012-02-12 16:03:30