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()
принимает строку какего первый параметр.И это пройденные узлы.Чтобы справиться с этим, каждый узел или набор узлов, переданный в качестве первого параметра, преобразуется в строку с помощью функции string()
:
Аргумент преобразуется в тип string какесли при вызове строковой функции.
string()
функция возвращает string-value
из первого узла :
Преобразованный набор узловв строку, возвращая строковое значение узла в наборе узлов, который является первым в порядке документа.Если набор узлов пуст, возвращается пустая строка.
string-value
узла элемента :
Строковое значениеузла элемента - это объединение строковых значений всех потомков текстового узла узла элемента в порядке документа.
string-value
текстового узла :
Строковым значением текстового узла являются символьные данные.
Итак, в основном string-value
- это весь текст, содержащийся в узле (объединение всего текста-потомка)узлов).
text()
- это тест узла, который соответствует любому текстовому узлу:
Тест текста узла () имеет значение true для любого текстового узла.Например, child :: text () выберет дочерние текстовые узлы узла контекста.
С учетом сказанного, //*[contains(text(), 'ABC')]
соответствует любому элементу (кроме корневого узла), первому текстовому узлу.из которых содержит ABC
.Так как text()
возвращает набор узлов, который содержит все дочерние текстовые узлы узла контекста (относительно которого вычисляется выражение).Но contains()
занимает только первое.Таким образом, для документа выше путь соответствует элементу Street
.
Следующее выражение //*[text()[contains(., 'ABC')]]
соответствует любому элементу (кроме корневого узла), который имеет хотя бы один дочерний текстовый узел, который содержит ABC
,.
представляет узел контекста.В данном случае это дочерний текстовый узел любого элемента, кроме корневого узла.Таким образом, для документа выше путь соответствует элементам Street
и Comment
.
Теперь, тогда //*[contains(., 'ABC')]
соответствует любому элементу (кроме корневого узла), который содержит ABC
(в объединениипотомков текстовых узлов).Для документа выше он соответствует элементам Home
, Addr
, Street
и Comment
.Таким образом, //*[contains(., 'BLAH ABC')]
соответствует элементам Home
, Addr
и Comment
.