Книга: Технология XSLT
Сокращенный синтаксис
Сокращенный синтаксис
Пути выборки — это наиболее часто используемые XPath-выражения и для того, чтобы сделать их менее громоздкими, в XPath имеется так называемый сокращенный синтаксис, с которым мы уже встречались в предыдущих главах. Его продукции записываются следующим образом:
[XP10] AbbreviatedAbsoluteLocationPath
:: = '//' RelativeLocationPath
[XP11] AbbreviatedRelativeLocationPath
::= RelativeLocationPath '//' Step
[XP12] AbbreviatedStep
::= '.'
| '..'
[XP13] AbbreviatedAxisSpecifier
::= '@'?
Первое сокращение, '//'
— это краткая версия для "/descendant-or-self::node()/"
. Шаг выборки descendant-or-self::node()
возвращает всех потомков контекстного узла (не включая узлов атрибутов и пространств имен). Сокращенный путь вида '//' RelativeLocationPath
раскрывается в путь вида
'/descendant-or-self::node()/' RelativeLocation
а путь вида RelativeLocationPath '//' Step
— в путь
RelativeLocationPath '/descendant-or-self::node()/' Step
Сокращенный шаг вида '.'
возвращает контекстный узел, его полная версия — self::node()
.
Сокращенный шаг '..
' возвращает родительский узел контекстного узла. Это сокращение равносильно шагу выборки parent::node()
.
Заметим, что сокращения "."
и ".."
являются сокращенными шагами выборки. Это, в частности, означает, что к ним нельзя присовокуплять предикаты и так далее. Выражение ".[ancestor::body]"
будет с точки зрения синтаксиса XPath некорректным. Вместо этого можно использовать выражение "self::node()[ancestor::body]"
, которое будет синтаксически правильным.
Наиболее часто используемой осью навигации является ось child
, содержащая все дочерние узлы контекстного узла. Шаги выборки, которые обращаются к дочерним узлам, имеют вид 'child::' NodeTest Predicate*
. Самым полезным сокращением является то, что в шагах такого вида дескриптор оси 'child::'
может быть опущен, и тогда упрощенные шаги будут иметь вид NodeTest Predicate*
.
Дескриптор оси навигации 'attribute::'
также может быть сокращен до '@'
. Шаг выборки 'attribute::' NodeTest Predicate*
может быть переписан с использованием, сокращенного синтаксиса в виде '@'. NodeTest Predicate*
.
Примеры:
? .//*
— выберет все элементы-потомки контекстного узла;
? ..//*
— выберет все дочерние элементы родителя контекстного узла;
? @*
— выберет все атрибуты контекстного узла;
? .//@*
— выберет все атрибуты всех потомков контекстного узла;
? //*
— выберет все элементы документа, содержащего контекстный узел;
? //@*
— выберет все атрибуты всех элементов документа, содержащего контекстный узел;
? html/body
— выберет элементы body
, принадлежащие дочерним элементам html
контекстного узла.