2010-07-13 31 views
2

從這塊HTML的:XPATH:選擇以下同胞和自節點

<tbody> 
    <tr> 
    <tr id="1" class="first"> 
    <tr id="2" class=""> 
    <tr id="3" class="last"> 
    <tr id="4" class="first"> 
    <tr id="5" class=""> 
    <tr id="6" class="last"> 
<tbody> 

我正嘗試獲取XPath表達式返回所有TR [@類=「第一」的節點是隨後TR其中沒有「第一」類,包括第一個節點。在這種情況下的一組與TR的id 1,2,3,並與IDS 4,5 TR,6.

從來就試着使用:

//tbody/tr[@class='first']/self::* | following-sibling::tr[not(starts-with(@class, 'first'))] 

沒有成功。對此有何想法?

感謝

回答

0

雖然它不是正是你想要什麼,這個表達式將返回所有節點在第一和最後一節課之間,但它不會在一起組。這是您只需一個XPath表達式即可完成的最佳選擇。

鑑於這樣的輸入,

<tbody> 
    <tr id="0" class=""/> 
    <tr id="1" class="first"/> 
    <tr id="2" class=""/> 
    <tr id="3" class="last"/> 
    <tr id="4" class="first"/> 
    <tr id="5" class=""/> 
    <tr id="6" class="last"/> 
    <tr id="7" class=""/> 
</tbody> 

這個XPath表達式,

/tbody/tr[ 
    (following-sibling::tr[@class='last'] and preceding-sibling::tr[@class='first']) 
    or @class='first' or @class='last' 
] 

將返回這些節點:

<tr id="1" class="first" /> 
<tr id="2" class="" /> 
<tr id="3" class="last" /> 
<tr id="4" class="first" /> 
<tr id="5" class="" /> 
<tr id="6" class="last" /> 

表達的工作方式是檢查所有tr元素之前,其兄弟姐妹是'第一',其後兄弟姐妹是'最後'。這樣它將在這些之外排除tr。但是,它不做任何分組。我不知道有什麼方法可以使用單個XPath表達式進行這種分組。如果必須這樣做,我將有一個XPath表達式返回所有'第一'tr s,然後繼續通過它的兄弟姐妹,直到找到'last'tr。也許別人知道有更好的方法來做到這一點。

+0

謝謝,我會讓它去使用position()和一些PHP來代替 – steaktartar 2010-07-13 13:42:06