XPath-запрос для получения n-го экземпляра элемента - PullRequest
116 голосов
/ 24 октября 2010

Существует HTML-файл (содержимое которого я не контролирую), который содержит несколько элементов input с одинаковым фиксированным атрибутом id, равным "search_query". Содержимое файла может измениться, но я знаю, что всегда хочу получить второй input элемент с атрибутом id "search_query".

Мне нужно выражение XPath для этого. Я пытался //input[@id="search_query"][2], но это не работает. Вот пример строки XML, где этот запрос не удался:

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

Имейте в виду, что приведенное выше является просто примером, а другой HTML-код может сильно отличаться, а элементы input могут появляться в любом месте без согласованной структуры документа (за исключением того, что я гарантирую, что всегда будет по крайней мере два input элементы с атрибутом id "search_query").

Какое правильное выражение XPath?

Ответы [ 2 ]

201 голосов
/ 24 октября 2010

Это FAQ :

//somexpression[$N]

означает «Найти каждый узел, выбранный //somexpression, который является $N -ым дочерним элементом его родителя».

То, что вы хотите, это :

(//input[@id="search_query"])[2]

Помните : оператор [] имеет более высокий приоритет (приоритет), чем сокращение //.

14 голосов
/ 24 октября 2010

Это похоже на работу:

/descendant::input[@id="search_query"][2]

Я исхожу из «Справочника по программированию XSLT 2.0 и XPath 2.0, 4-е издание» Майкла Кея.

В разделе «Сокращенный синтаксис» спецификации языка путей XML есть также примечание http://www.w3.org/TR/xpath/#path-abbrev, в котором содержится подсказка.

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