Таким образом, путь выборки имеет четыре основных варианта, которые мы сейчас и разберем:
□ путь
'/'
— используется для обращения к корневому узлу дерева;
□ путь вида
RelativeLocationPath
— есть относительный путь выборки;
□ путь вида
'/' RelativeLocationPath
— это абсолютный путь выборки, то есть относительный путь, которому предшествует
'/'
;
□ путь вида
'//' RelativeLocationPath
—
это абсолютный путь выборки, в котором использован сокращенный синтаксис. Путь такого вида эквивалентен пути вида
'/descendant-or-self:node/' RelativeLocationPath
. Первой его частью является путь
'/descendant-or-self:node'
, который выбирает все узлы документа (кроме узлов атрибутов и пространств имен).
Главной деталью
LocationPath
является относительный путь выборки, продукция которого также может быть переписана в раскрытом и упрощенном виде:
RelativeLocationPath ::= Step
| RelativeLocationPath '/' Step
| RelativeLocationPath '//' Step
В соответствии с этой продукцией, относительный путь выборки состоит из одного или нескольких шагов выборки, разделенных
'/'
или
'//'
. Как уже отмечалось ранее, конструкция
'//'
есть сокращенный вариант от
'/descendant-or-self::node/'
. Таким образом, главным элементом пути выборки является шаг выборки.
Примеры:
□
/
— выберет корневой узел документа;
□
/а
— выберет элемент
а
, находящийся в корне документа;
□
//а
— выберет множество всех элементов
а
текущего документа.
Шаги выборки
Любой путь — это последовательность шагов, путь выборки — это последовательности шагов выборки, которые нужно совершить, чтобы получить искомый результат. Каждый шаг выборки состоит из трех частей.
□ Первая часть называется осью навигации — она показывает направление, в котором будет производиться выбор на данном шаге. Например, можно выбирать дочерние узлы, узлы-атрибуты или родительские узлы контекстного узла (см. также раздел "Оси навигации" данной главы).
□ Второй частью шага выборки является тест узла. Тест узла показывает, узлы какого типа или с какими именами должны быть выбраны на данном шаге.
□ Третья часть шага выборки — это один или несколько предикатов, логических выражений, которые фильтруют множество узлов, выбранных на данном шаге.
Проще говоря, ось навигации отвечает на вопрос "куда двигаемся?", тест узла — на вопрос "какие узлы ищем?", а предикаты — на вопрос "какими свойствами должны обладать выбираемые узлы?".
Пример
Шаг выборки
attribute::href[. = 'http://www.xsltdev.ru']
состоит из оси навигации
attribute
, которая выбирает атрибуты данного узла, теста узла
href
, который выбирает узлы с именем
href
и нулевым пространством имен, и предиката
[. = 'http://www.xsitdev.ru']
,
который оставляет в выбираемом множестве те узлы, текстовое значение которых равно
"http://www.xsltdev.ru"
. Таким образом, на этом шаге будут выбраны все атрибуты
href
текущего узла, имеющие значение
"http://www.xsltdev.ru"
.
Шаг выборки соответствует EBNF-продукции
Step
, а первая его часть, ось навигации — продукции
AxisSpecifier
:
[XP4] Step ::= AxisSpecifier NodeTest Predicate*
| AbbreviatedStep
[XP5] AxisSpecifier ::= AxisName '::'
| AbbreviatedAxisSpecifier
Продукцию
Step
можно значительно упростить и записать в следующем виде:
Step ::= '.'
| '..'
| NodeTest Predicate*
| '@' NodeTest Predicate*
| AxisName '::' NodeTest Predicate*
В первых четырех случаях шаг выборки записан при помощи сокращенного синтаксиса, а именно:
□ шаг выборки
'.'
эквивалентен шагу
self::node
, который выбирает контекстный узел;
□ шаг выборки
'..'
эквивалентен шагу
parent::node
, который выбирает родительский узел контекстного узла;
□ шаг выборки вида
NodeTest Predicate*
эквивалентен шагу выборки вида
'child::' NodeTest Predicate*
, который выбирает узлы из множества дочерних узлов контекстного узла;
□ шаг выборки вида
'@' NodeTest Predicate*
эквивалентен шагу выборки вида
'attribute::' NodeTest Predicate*
, который выбирает узлы из множества атрибутов контекстного узла.
Последний случай,
AxisName ' ::' NodeTest Predicate*
представляет полный синтаксис шага выборки: сначала идет наименование оси и тест узла, разделенные двумя двоеточиями (
"::"
), затем несколько предикатов.
Оси навигации
Важной особенностью путей выборки является то, что шаги в них могут совершаться не в двух направлениях (вглубь и на верхний уровень), как в случае с файловыми системами, а во многих других. При выполнении шага выборки из некоторого контекстного узла направление движения по логическому дереву документа задается первой частью этого шага, осью навигации. В XPath имеется 13 осей навигации, а именно:
□
self
— эта ось навигации содержит только сам контекстный узел;
□
child
— содержит все дочерние узлы контекстного узла; не содержит узлов атрибутов и пространств имен;
□
parent
— содержит родительский узел контекстного узла, если он есть;
□
descendant
— содержит все узлы-потомки контекстного узла; не содержит узлов атрибутов и пространств имен;
□
descendant-or-self
— содержит контекстный узел, а также всех его потомков; не содержит узлов атрибутов и пространств имен;