XML-документ:
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
Выражение XPath:
//*[contains(text(), 'ABC')]
//*
соответствует любому потомок элемента из корневого узла . То есть любой элемент, кроме корневого узла.
[...]
является предикатом , он фильтрует набор узлов. Возвращает узлы, для которых ...
есть true
:
Предикат фильтрует набор узлов [...], чтобы создать новый набор узлов. Для каждого узла в наборе узлов, подлежащем фильтрации, оценивается PredicateExpr [...]; если PredicateExpr для данного узла оценивается как true, узел включается в новый набор узлов; в противном случае, это не входит.
contains('haystack', 'needle')
возвращает, true
если haystack
содержит needle
:
Функция: логическое содержит (строка, строка)
Функция contains возвращает true, если первая строка аргумента содержит вторую строку аргумента, а в противном случае возвращает false.
Но contains()
принимает строку в качестве первого параметра. И это пройденные узлы. Чтобы справиться с этим, каждый узел или набор узлов, переданный в качестве первого параметра, преобразуется в строку string()
функцией:
Аргумент преобразуется в тип string как будто путем вызова строковой функции.
string()
функция возвращает string-value
из первого узла :
Набор узлов преобразуется в строку, возвращая строковое значение узла в наборе узлов, который находится первым в порядке документа. Если набор узлов пуст, возвращается пустая строка.
string-value
из узла элемента :
Строковое значение узла элемента - это объединение строковых значений всех потомков текстового узла узла элемента в порядке документа.
string-value
из текстового узла :
Строковое значение текстового узла - это символьные данные.
Таким образом, в основном string-value
это весь текст, который содержится в узле (объединение всех дочерних текстовых узлов).
text()
это тест узла, который соответствует любому текстовому узлу:
Тест узла text () имеет значение true для любого текстового узла. Например, child :: text () выберет дочерние текстовые узлы узла контекста.
Сказав это, //*[contains(text(), 'ABC')]
соответствует любому элементу (кроме корневого узла), первый текстовый узел которого содержит ABC
. Since text()
возвращает набор узлов, который содержит все дочерние текстовые узлы узла контекста (относительно которого вычисляется выражение). Но contains()
занимает только первое. Таким образом, для документа выше путь соответствует Street
элементу.
Следующее выражение //*[text()[contains(., 'ABC')]]
соответствует любому элементу (кроме корневого узла), который имеет хотя бы один дочерний текстовый узел, который содержит ABC
. .
представляет узел контекста. В данном случае это дочерний текстовый узел любого элемента, кроме корневого узла. Таким образом, для документа выше путь соответствует Street
, иComment
элементы.
Теперь, тогда, //*[contains(., 'ABC')]
соответствует любому элементу (кроме корневого узла), который содержит ABC
(в конкатенации нисходящих текстовых узлов). Для документа выше , что он соответствует Home
, с Addr
, в Street
, и Comment
элементы. По существу, //*[contains(., 'BLAH ABC')]
соответствует Home
, то Addr
и Comment
элементы.
//*[contains(text(),'ABC')]
возвращает только<Street>
элемент. Это не возвращает никаких предков<Street>
или<Comment>
.