Запрос XPath для получения n-го экземпляра элемента


есть HTML-файл (содержимое которого я не контролирую), который имеет несколько input элементы все с той же фиксированной на "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 94

2 ответа:

это FAQ:

//somexpression[$N]

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

что вы хотите:

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

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

Это, кажется, работает:

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

Я иду это из "XSLT 2.0 и XPath 2.0 Programmer'S Reference, 4th Edition" Майкла Кея.

есть также примечание в разделе "сокращенный синтаксис" спецификации языка XML Path http://www.w3.org/TR/xpath/#path-abbrev это дало ключ к разгадке.