2014-10-09 66 views
3

如果可能,我想使用單個XPath表達式查找節點的所有緊鄰兄弟。給定了輸入如何使用XPath查找所有緊鄰的兄弟姐妹

<a id="1"/> 
<start/> 
<a id="2"/> 
<a id="3"/> 
<b/> 
<a id="4"/> 

並且類似於//start/following-sibling::a XPath表達式,我想選擇一個[2],和一個[3],但不是一個[4]。此外,如果開始a [2]之間有任何介入元素,則不應選擇任何內容。

回答

4

最簡單的一個我能找到的是:

//start/following-sibling::a intersect //start/following-sibling::*[name()!='a'][1]/preceding-sibling::a 

這樣做是:

  1. 採取以下start所有a兄弟姐妹://start/following-sibling::a。 (結果:a2,a3,a4。)現在將其設置爲一側。
  2. 然後採取以下start的第一個非兄弟姐妹://start/following-sibling::*[name()!='a'][1](結果:B)
  3. ,發現所有它之前的a節點:/preceding-sibling::a。 (結果:A1,A2,A3)
  4. 取1和3的交叉點(結果:A2,A3)

更新:另一種方法短語是//start/following-sibling::*[name()!='a'][1]/preceding-sibling::a[preceding-sibling::start],這大致翻譯爲:採取第一個非兄弟姐妹start,向後倒數,但只選擇仍然在前面的元素start

更新2:如果你知道b將永遠被稱爲b,當然你也可以更換,而難以閱讀following-sibling::*[name()!='a'][1]部分與following-sibling::b[1]

+0

謝謝!您的**更新**中的方法完美。必須在我的XPath技能上工作...... – svenax 2014-10-09 20:12:49

0

沒有辦法測試,但//start/following-sibling::*[1][self::a]應該返回立即以下的兄弟,但只有當它的「一」

+0

這很好,但正如你所說,它只返回第一個'a'。要求是將所有後續的「a」返回到遇到不同標籤的地方。 – biziclop 2014-10-09 15:38:48

+0

是的 - 我認爲你的交集會更好:) – Ochi 2014-10-09 15:40:53