2016-02-15 85 views
0

兩個元素之間的元素這裏有類似HTML的東西我的工作:獲得具有特定性能

<body> 

    <tr class="heading"> 
    <td colspan="2"> Heading 1 </td> 
    </tr> 

    <tr> 
    <td>L 1</td> 
    <td>R 1</td> 
    </tr> 

    <tr> 
    <td>L 2</td> 
    <td>R 2</td> 
    </tr> 

    <tr class="heading"> 
    <td colspan="2"> Heading 2</td> 
    </tr> 

    <tr> 
    <td>L 3</td> 
    <td>R 3</td> 
    </tr> 

</body> 

我想從tr一切都td[1]年代後「標題1」,而不是什麼「標題2」之後(或包括「標題2」)。

理想情況下,我需要能夠做到這一點只有「標題1」作爲輸入 - 我想要我提供的標題下的所有元素,但在新的標題下忽略任何東西。

這在XPath中可能嗎?

回答

-1

你可以做這樣的事情:

<tr class="heading"> 
    <td colspan="2"> Heading 1 </td> 
    </tr> 

    <tr> 
    <td class="left">L 1</td> 
    <td class="right">R 1</td> 
    </tr> 

    <tr> 
    <td class="left">L 2</td> 
    <td class="right">R 2</td> 
    </tr> 

    <tr class="heading"> 
    <td colspan="2"> Heading 2</td> 
    </tr> 

    <tr> 
    <td class="left">L 3</td> 
    <td class="right">R 3</td> 
    </tr> 

</body> 

然後指定你在CSS所需的顏色。

+1

不知道你甚至讀了一個問題,我不知道你是什麼回答! –

1

我把代碼從你的答案被刪除,並使其工作...和醜陋:

(//tr[preceding-sibling::tr[@class='heading' and td=' Heading 1 '] and following-sibling::tr[@class='heading']]/td[1]) | (//tr[preceding-sibling::tr[@class='heading' and td=' Heading 1 '] and following-sibling::tr[@class='heading']]/td[2]) 

如果您正在使用的編程語言,它可能會更好做的代碼。

+0

這幾乎是正確的,但是它選擇所有'td'元素,而不僅僅是相對於其父元素的第一個元素。 –

1

我不同意到目前爲止的任何答案。 XPath表達式,它正是你所要求的是

//tr[@class = 'heading' and normalize-space(td) = 'Heading 1']/following::td[following::tr[@class = 'heading' and normalize-space(td) = 'Heading 2']] 

它轉換爲

//tr          select all `tr` elements anywhere in the document 
[@class = 'heading'      but only if they have a `class` attribute whose 
             value is equal to "heading"     
and normalize-space(td) = 'Heading 1'] and only if they contain a `td` element which has 
             a string value of "Heading 1". 
/following::td       select all `td` elements that follow them 
[following::tr       but only if they are followed by a `tr` element 
[@class = 'heading'      which again has a `class` attribute with "heading" 
             as its value 
and normalize-space(td) = 'Heading 2']] and only if this `tr` element has a `td` child 
             element with "Heading 2" as its string value 

並且將返回以下(由------分開的單獨的結果):

<td>L 1</td> 
----------------------- 
<td>R 1</td> 
----------------------- 
<td>L 2</td> 
----------------------- 
<td>R 2</td> 

normalize-space()函數可以去除尾隨空白字符串。


編輯:如果您打算只選擇幾個td元素第一

//tr[@class = 'heading' and normalize-space(td) = 'Heading 1']/following::tr/td[position() = 1 and following::tr[@class = 'heading' and normalize-space(td) = 'Heading 2']] 

,其結果將是

<td>L 1</td> 
----------------------- 
<td>L 2</td> 

爲了更加完整,以解釋如下情況:

<body> 

    <tr class="heading"> 
    <td colspan="2"> Heading 1 </td> 
    </tr> 

    <tr> 
    <td>L 1</td> 
    <td>R 1</td> 
<td>third</td> 
    </tr> 

    <tr> 
    <td>L 2</td> 
    <td>R 2</td> 
    </tr> 

    <tr class="heading"> 
    <td colspan="2"> Heading other</td> 
    </tr> 

    <tr> 
    <td>L 3</td> 
    <td>R 3</td> 
    </tr> 

<tr class="heading"> 
    <td colspan="2"> Heading 2</td> 
    </tr> 

</body> 

凡是有 「標題1」 和 「標題2」,其子td元素不應該出現在結果之間不相關的標題,使用

//tr[@class = 'heading' and normalize-space(td) = 'Heading 1']/following::tr[not(@class)]/td[position() = 1 and following::tr[@class = 'heading' and normalize-space(td) = 'Heading 2']] 

編輯

此刻,您的xpath會查找2個標題之間的元素,但是對於頁面上的最後一個組該頁面,不會有第二個標題來引用。

到現在爲止,您沒有解釋實際數據中是這種情況。使用

//tr[@class = 'heading' and normalize-space(td) = 'Heading 1']/following::tr[not(@class)]/td[position() = 1 and not(preceding::tr[@class = 'heading' and normalize-space(td) = 'Heading 2'])] 

編輯2

我做的,但我還加了注「理想我需要能夠只做到這一點‘標題1’作爲輸入 - 我需要我提供的標題下的所有元素,但在新標題下忽略任何內容。「

//tr[@class = 'heading' and normalize-space(td) = 'Heading 1']/following::tr[not(@class)]/td[position() = 1 and not(preceding::tr[@class = 'heading' and normalize-space(td) != 'Heading 1'])] 
+0

謝謝你的詳細答案,據我所知,這不適用於沒有標題的東西,對嗎?它也不允許我指定「標題1」並獲取它所涉及的所有行!我最終只是用編程語言來做。 –

+0

@Joe _「這不適用於沒有標題的東西,是正確的嗎?」_我不確切地知道你的意思,但到目前爲止,你沒有解釋這是一個要求。我也不知道你的意思是「指定」某些東西,並得到「與之相關的行」。 –

+0

目前,您的xpath會查找2個標題之間的元素,但在頁面_last_組的情況下,不會引用第二個標題。 我希望能夠在代碼中爲我的函數提供「標題1」,這將使我成爲一個xpath字符串,它將獲取元素。我不想在'標題1'和'標題2'之間說'「。 –