Книга: Технология 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 контекстного узла.

Оглавление книги


Генерация: 1.188. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз