Технология 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
контекстного узла. Примеры путей выборки
Простые шаги выборки:
□
child::*
— выберет все дочерние элементы контекстного узла; □
child::comment
— выберет все узлы комментариев контекстного узла; □
child::node
— выберет все дочерние узлы контекстного узла вне зависимости от их типа; □
child::query
— выберет все дочерние элементы контекстного узла, имеющие имя query
; □
child::xsql:*
— выберет все дочерние элементы, которые находятся в пространстве имен, определяемом префиксом xsql
; □
child::xsql:query
— выберет все дочерние элементы query
, которые находятся в пространстве имен, определяемом префиксом xsql
; □
attribute::*
— выберет все атрибуты контекстного узла; □
attribute::href
— выберет атрибут href
контекстного узла, если он существует; □
parent::*
— выберет родительский узел контекстного узла, если тот является элементом, и пустое множество, если родительский узел имеет другой тип, например является корнем дерева; □
parent::node
— выберет родительский узел контекстного узла вне зависимости от его типа. Единственный случай, когда этот шаг выберет пустое множество — это когда контекстный узел является корневым узлом документа; □
parent::xsl:template
— выберет родительский узел, если тот является элементом с именем template и имеет пространство имен с префиксом xsl
, иначе выберет пустое множество; □
self::*
— выберет контекстный узел, если он является элементом и пустое множество узлов, если контекстный узел имеет другой тип; □
self:*
— выберет все дочерние элементы контекстного узла, принадлежащие пространству имен с префиксом self
; □
self::text
— выберет контекстный узел, если он является текстовым узлом; □
self::node
— выберет контекстный узел вне зависимости от его типа; □
self::query
— выберет контекстный узел, если он является элементом с именем query
, и пустое множество, если контекстный узел имеет другое имя или не является элементом; □
preceding::para
— выберет все элементы para
, которые предшествуют контекстному узлу в порядке просмотра документа;
Поделиться:
Популярные книги
Фронтовик
3. Красноармеец
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Мастер 5
5. Мастер
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Жребий некроманта 3
3. Жребий некроманта
Фантастика:
боевая фантастика
5.56
рейтинг книги
Неудержимый. Книга II
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Пятнадцать ножевых 3
3. 15 ножевых
Фантастика:
попаданцы
альтернативная история
7.71
рейтинг книги
Метатель. Книга 2
2. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Фиктивный брак
Фантастика:
фэнтези
6.71
рейтинг книги
Корпулентные достоинства, или Знатный переполох. Дилогия
Фантастика:
юмористическая фантастика
7.53
рейтинг книги
Убивать чтобы жить 5
5. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Кротовский, вы сдурели
4. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
рпг
5.00
рейтинг книги
На границе империй. Том 5
5. Фортуна дама переменчивая
Фантастика:
боевая фантастика
попаданцы
7.50
рейтинг книги
Проданная невеста
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Росток
2. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
7.00
рейтинг книги
Чайлдфри
Любовные романы:
современные любовные романы
6.51