Запрос 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 ответа:
это 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 это дало ключ к разгадке.