XPath: поиск первого появления у детей и братьев и сестер

Итак, у меня есть некоторый HTML, который выглядит так:

<tr class="a">
    <td>...</td>
    <td>...</td>
</tr>
<tr>
    <td>....</td>
    <td class="b">A</td>
</tr>
<tr>....</tr>
<tr class="a">
    <td class="b">B</td>
    <td>....</td>
</tr>
<tr>
    <td class="b">Not this</td>
    <td>....</td>
</tr>

В основном я хочу найти первый экземпляр td класса b, следующего за tr с классом a. Проблема заключается в том, что он может быть либо в дочернем элементе tr, либо в следующем tr после него.

Я могу получить второй случай с:

//tr[@class="a"]//td[@class="b"]

Но это пропускает первый случай, потому что TD находится в брате, а не в прямом потомке. Идеи?


person OverlordQ    schedule 05.06.2015    source источник


Ответы (1)


Для 2-го случая (td является прямым потомком tr):

//tr[@class="a"]//td[@class="b"][1] 

Для 1-го случая (td следует за tr), это не попадает в категорию 2-го случая:

//tr[@class="a" and not(.//td[@class="b"])]/following::td[@class="b"][1]

Объединение двух запросов xpath вместе с использованием оператора объединения (|) дает ожидаемый результат:

//tr[@class="a"]//td[@class="b"][1] | //tr[@class="a" and not(.//td[@class="b"])]/following::td[@class="b"][1]

вывод:

Element='<td class="b">A</td>'
Element='<td class="b">B</td>'
person har07    schedule 05.06.2015
comment
Спасибо, вроде работает отлично. Все еще изучаю XPath, еще не был уверен во всех осях. - person OverlordQ; 05.06.2015