2013-02-03 71 views
0

我試圖選擇某個類別的<div>與之後的第一個<hr>之間的所有內容。在HTML中選擇hr,似乎按相反順序選擇?

與此查詢:

//div[@id='a']/*[preceding::div/@class='b' and following:hr[0]]

而且這個例子HTML:

<div id="a">div a 
    <div class="b">div b</div> 
    <p>1</p> 
    text1 
    <a>2</a> 
    text2 
    <div>3</div> 
    <hr> 
    <div>4</div> 
    <hr> 
    <div>5</div> 
    <hr> 
</div> 

我得到 「B」 類和最後hrdiv之間的一切。用hr[*n*]選擇似乎以相反的順序選擇。 ... and following::hr[last()]]也選擇到最後一小時,這是我所期望的。在這個例子中,... and following::hr[2]將選擇第一個hr,但實際上我不能保證會有多少。我怎樣才能選擇第一個hr

回答

1

那麼,首先,following::hr[0]始終是一個空序列,因爲節點編號從1;所以這部分條件是錯誤的,所以你的查詢不應該選擇任何東西。

但實際上你寫了following:hr[0],這應該是一個語法錯誤,除非你聲明瞭命名空間前綴「following」。不知何故,我不認爲你向我們展示的代碼是你執行的代碼。我們假設你將它改爲following::hr[1]。如果它有一個叫做hr的後續元素,也就是說,直到最後的hr,這就是你描述的症狀,這將選擇所有的東西。

要選擇第一個hr之前的節點,請選擇那些沒有先前hr的節點,即not(preceding::hr)

除了我懷疑所有的「跟隨」和「前面」軸應該是following-siblingpreceding-sibling

+0

謝謝,這確實有用。以下:: hr [0]是一個錯字,它應該是(並且在我的代碼中)在:: hr [1]之後。 – dysfunction

+0

後續工作:我編輯了示例HTML,在第一個'


'之前添加一些裸文本節點。我怎樣才能選擇這些?我認爲''// div [@ id ='a']/* [前置:: div/@ class ='b'而不是(之前:: hr]] | // div [@ id ='a']]/text()[之前:: div/@ class ='b'而不是(之前:: hr)]'但是仍然不選擇裸文本;但是,// // div [@ id ='a' ]/text()[前置:: div/@ class ='b'而不是(先前:: hr)]'不選擇**只是**裸文本 – dysfunction

+0

如果您想選擇所有節點,而不僅僅是給定軸的主節點類型的節點,使用'node()'而不是'*' –