Ответы:
Использование:
(/bookstore/book[@location='US'])[1]
Сначала будут получены элементы книги с атрибутом местоположения, равным «США». Затем он выберет первый узел из этого набора. Обратите внимание на использование скобок, которые требуются в некоторых реализациях.
Обратите внимание, что это не то же самое, что /bookstore/book[1][@location='US']
если первый элемент также не имеет этого атрибута местоположения.
/bookstore/book[@location='US'][1]
не возвращает все книги из США. Я проверял это много раз и в разных реализациях xpath. /bookstore/book[@location='US'][1]
возвращает первую книгу «США» в книжном магазине. Если есть несколько книжных магазинов, то он вернет первый из каждого. Это то, о чем просил OP (первый узел в книжном магазине). Ваша версия возвращает только одну книгу из всех книжных магазинов (первое совпадение).
/bookstore/book[@location='US'][1]
работает только с простой структурой.
Добавьте немного больше структуры и вещи ломаются.
С участием
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
/bookstore/category/book[@location='US'][1]
доходность
<book location="US">A1</book>
<book location="US">B2</book>
не «первый узел, который соответствует более сложному условию». /bookstore/category/book[@location='US'][2]
ничего не возвращает
С помощью скобок вы можете получить результат, для которого был задан исходный вопрос:
(/bookstore/category/book[@location='US'])[1]
дает
<book location="US">A1</book>
и (/bookstore/category/book[@location='US'])[2]
работает как положено.
/bookstore/book[1]
и НЕ (/bookstore/book)[1]
. Предоставленный вами случай отличается от того, о котором просили. Предположительно, ОП принял мой ответ, так как он сделал то, что ожидал (и попросил).
'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. В случае совпадения множества узлов name
.
Как объяснение ответа Джонатана Фингланда:
[position()=1 and @location='US']
) должны быть истинными в целом[position()=1][@location='US']
) должны быть истинными одно за другим[position()=1][@location='US']
! = [@location='US'][position()=1]
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
может быть сокращен до[1]
Вы можете строить сложные выражения в предикатах с логическими операторами « and
» и « or
», а также с функциями Логического XPath not()
, true()
и false()
. Кроме того, вы можете заключить подвыражения в скобки.
Самый простой способ найти первый английский узел книги (во всем документе), принимая во внимание более сложный структурированный XML-файл, например:
<bookstore>
<category>
<book location="US">A1</book>
<book location="FIN">A2</book>
</category>
<category>
<book location="FIN">B1</book>
<book location="US">B2</book>
</category>
</bookstore>
такое выражение xpath:
/descendant::book[@location='US'][1]
<bookstore>
<book location="US">A1</book>
<category>
<book location="US">B1</book>
<book location="FIN">B2</book>
</category>
<section>
<book location="FIN">C1</book>
<book location="US">C2</book>
</section>
</bookstore>
Так, учитывая вышеизложенное; Вы можете выбрать первую книгу с
(//book[@location='US'])[1]
И это найдет первое, где есть США. [A1]
//book[@location='US']
Вернул бы узел, установленный со всеми книгами с местоположением US. [А1, В1, С2]
(//category/book[@location='US'])[1]
Вернет первое местоположение книги США, которое существует в категории в любом месте документа. [В1]
(/bookstore//book[@location='US'])[1]
вернет первую книгу с местоположением US, которое существует в любом месте под книжным магазином корневого элемента; делая часть книжного магазина избыточной. [A1]
В прямой ответ:
/bookstore/book[@location='US'][1]
Вернет вам первый узел для элемента книги с местоположением US, которое находится в книжном магазине [A1]
Кстати, если вы хотите, в этом примере найти первую книгу из США, которая не была прямым потомком книжного магазина:
(/bookstore/*//book[@location='US'])[1]
Используйте индекс, чтобы получить желаемый узел, если xpath сложный или имеется более одного узла с одинаковым xpath.
Пример:
(//bookstore[@location = 'US'])[index]
Вы можете дать номер, какой узел вы хотите.
например
<input b="demo">
И
(input[@b='demo'])[1]
С помощью онлайн- тестера xpath я пишу этот ответ ...
Для этого:
<table id="t2"><tbody>
<tr><td>123</td><td>other</td></tr>
<tr><td>foo</td><td>columns</td></tr>
<tr><td>bar</td><td>are</td></tr>
<tr><td>xyz</td><td>ignored</td></tr>
</tbody></table>
следующий xpath:
id("t2") / tbody / tr / td[1]
выходы:
123
foo
bar
xyz
Поскольку 1 означает выбор всех элементов td, которые являются первыми дочерними элементами их собственного прямого родителя.
Но следующий xpath:
(id("t2") / tbody / tr / td)[1]
выходы:
123