XPath позиционная фильтрация не работает должным образом - PullRequest
2 голосов
/ 15 декабря 2011

У меня есть следующий HTML

<html>
[snip]
<table>
 [snip]
 <tr><td>One</td><td>1-1</td></tr>
 [snip]
</table>
[snip]
<table>
 [snip]
 <tr><td>One</td><td>1-1-1</td></tr>
 [snip]
</table>
</html>

.. и я пытаюсь получить значение "1-1-1", используя следующий xpath

//tr[td[1] = 'One'][2]/td[2]

Я бы описал это как получение значения 2-го элемента td из 2-го элемента tr, который содержит хотя бы один элемент td, где значением 1-го элемента td является 'One'. Я пробовал различные изменения, такие как position()=last(), но безрезультатно.

Я только знаю, что второе вхождение текста «Один» в первой ячейке родительской строки идентифицирует строку, из которой я могу извлечь текст из 2-й ячейки ... поэтому что-то жестко закодированное не будет работать (например, //table[2]/tr[1]/td[2]).

Может кто-нибудь сказать мне, почему вышеупомянутый xpath не будет работать? Я посмотрел на сайте w3c и нашел xpaths вроде:

child::*[self::chapter or self::appendix][position()=last()] 

Описывается как:

выбирает последнюю главу или приложение дочернего элемента контекстного узла

.. что похоже на то, что я пытаюсь сделать, но, возможно, вложение запрещено ..

1 Ответ

2 голосов
/ 15 декабря 2011

Краткий ответ

Использование:

(//tr[td[1]='One'])[2]/td[2]

Объяснение

Я бы описал это какполучить 2-е значение элемента td из 2-го элемента tr, который содержит хотя бы один элемент td, где значение 1-го элемента td равно «One».

То, что на самом деле выбирает //tr[td[1]='One'][2], это все элементы trимея первого td ребенка, чьи значения One и являются вторыми такими tr их родителями .

Почему?Это выражение:

//tr[td[1]='One'][2]

... эквивалентно:

/descendant-or-self::node()/child::tr[td[1]='One'][2]

Написано таким образом, легче увидеть, что [2] применяется раньше, чем вы первоначально думали.Добавление скобок:

(/descendant-or-self::node()/child::tr[td[1]='One'])[2]

... заставляет нас сначала выбрать все элементы tr, имеющие первого td дочернего элемента со значением One , а затем занимает второй узелиз этого набора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...