Операторы и специальные символы (XPath)

Выражения XPath создаются с помощью операторов и специальных символов, приведенных в следующей таблице.

/

Оператор «дочерний элемент»: выбирает непосредственные дочерние элементы коллекции, указанной слева. Если этот оператор пути стоит в начале шаблона, будут выбраны дочерние элементы корневого узла.

//

Рекурсивный спуск; поиск заданного элемента на любой глубине. Если этот оператор пути стоит в начале шаблона, рекурсивный спуск будет вестись из корневого узла.

.

Указывает текущий контекст.

..

Родитель узла текущего контекста.

*

Символ подстановки; выбирает все элементы независимо от их имени.

@

Атрибут; префикс имени атрибута.

@*

Символ подстановки для атрибута; выбирает все атрибуты независимо от имени.

:

Разделитель пространства имени; отделяет префикс пространства имени от собственно имени элемента или атрибута.

( )

Группирует операции для явного задания порядка их выполнения.

[ ]

Применяет шаблон фильтра.

[ ]

Оператор Subscript; используется для индексирования коллекции.

+

Выполняет сложение.

-

Выполняет вычитание.

div

Выполняет деление с плавающей запятой по стандарту IEEE 754.

*

Выполняет умножение.

mod

Возвращает остаток от усекающего деления.

Данная таблица не включает логических операторов и операторов над множествами; они перечислены в разделах Логические выражения, выражения сравнения, выражения над множествами и Операции над множествами.

Приоритет операций (от высокого к низкому) определяется согласно следующей таблице.

Приоритет

Знак

Назначение

1

( )

Группирование

2

[ ]

Фильтры

3

/ //

Операции с путями

Оператор группирования, (), применим только для выражения пути верхнего уровня. Например, (//author/degree | //author/name) - допустимая операция группировки, а //author/(degree | name) - недопустимая.

Операторы шаблонов фильтра ([]) имеют более высокий приоритет, чем операторы пути (/ и //). Например, выражение //comment()[3] выбирает все комментарии с индексом, равным 3, относительно родительского элемента комментария в любом месте документа. Оно отличается от выражения (//comment())[3], выбирающего третий комментарий из множества всех комментариев относительно родителя. Первое выражение может возвращать несколько комментариев, а второе - только один.

Эти операторы и специальные символы подробно описаны далее в данном руководстве.

Операторы пути

С помощью операторов пути (/ и //) можно описать коллекцию элементов определенного типа. Эти операторы принимают в качестве аргументов коллекцию «с левой стороны», из которой производится выбор, и коллекцию «с правой стороны» как инструкцию, указывающую, какие элементы нужно выбирать. Оператор «дочерний элемент» (/) производит выбор из непосредственных дочерних элементов левой коллекции, в то время как оператор «потомок» (//) производит выбор из всех потомков коллекции левой стороны. Оператор // можно рассматривать как подстановку для одного или нескольких уровней иерархии.

Следует заметить, что операторы пути изменяют контекст по мере выполнения запроса. Соединяя несколько операторов пути, пользователи могут проходить все дерево документа.

Примеры

Выражение

Ссылается на

author/first-name

Все элементы <first-name> внутри элемента <author> текущего узла контекста.

bookstore//title

Все элементы <title> на первом или более глубоких уровнях элемента <bookstore> (наследники произвольного уровня). Заметьте отличие от следующего шаблона: bookstore/*/title.

bookstore/*/title

Все элементы <title>, являющиеся «внуками» элементов <bookstore>.

bookstore//book/excerpt//emph

Все элементы <emph> в любом месте внутри элементов <excerpt>, дочерних по отношению к элементам <book>, находящимся в любом месте внутри элемента <bookstore>.

.//title

Все элементы <title> на первом или более глубоких уровнях текущего контекста. Учтите, что только в этой ситуации требуется нотация с использованием точек.

Символ-шаблон

Элемент можно использовать, не указывая его имя, с помощью коллекции символа подстановки (*). Коллекция * означает все элементы, являющиеся дочерними для текущего контекста, независимо от имени тега.

ms256122.collapse_all(ru-ru,VS.120).gifПримеры

Выражение

Ссылается на

author/*

Все дочерние элементы элементов <author>.

book/*/last-name

Все элементы <last–name>, являющиеся «внуками» элементов <book>.

*/*

Все элементы-"внуки" текущего контекста.

my:book

Элемент <book> из пространства имен my.

my:*

Все элементы из пространства имен my.

Учтите, что шаблон *:book не поддерживается.

Атрибуты

В XPath имена атрибутов обозначаются символом @. Атрибуты и дочерние элементы обрабатываются одинаково, и эти два типа считаются эквивалентными везде, где это возможно.

Примечание

Атрибуты не могут содержать дочерних элементов, поэтому применение операторов пути к атрибутам порождает синтаксические ошибки.Кроме того, к атрибутам нельзя применять индексы, поскольку их порядок по определению не задан.

ms256122.collapse_all(ru-ru,VS.120).gifПримеры

Выражение

Ссылается на

@style

Атрибут style контекста текущего элемента.

price/@exchange

Атрибут exchange элементов <price> в текущем контексте.

book/@style

Атрибут style всех <book> элементов.

Следующий пример содержит ошибку, поскольку у атрибута не может быть дочерних элементов.

price/@exchange/total

Поиск нескольких атрибутов

Все атрибуты элемента можно получить с помощью метода @*. Это может быть полезно для приложений, рассматривающих атрибуты как эквиваленты полей записи.

ms256122.collapse_all(ru-ru,VS.120).gifПримеры

Выражение

Ссылается на

@*

Все атрибуты текущего контекстного узла.

@my:*

Все атрибуты из пространства имен my. Сюда не входят атрибуты с неполным именем, принадлежащие элементам из пространства имен my.

Учтите, что шаблон @*:title не поддерживается.

См. также

Ссылки

Примеры XPath

Основные понятия

Операции над множествами (XPath)

Образец XML-файла с синтаксисом XPath (inventory.xml)