Технология XSLT
Шрифт:
Таким образом, предикаты определяют свойства, которыми должны обладать выбираемые узлы.
Примеры:
□
a[1]
— выберет первый в порядке просмотра документа дочерний элемент а
контекстного узла; □
a[position mod 2 = 0]
— выберет все четные дочерние элементы а
; □
*[. = 'а']
— выберет все дочерние элементы, текстовое значение которых равно "а
"; □
*[name = 'a']
— выберет все дочерние элементы, имя которых равно "а
"; □
*[starts-with(name, 'a')]
—
а
"; □
*[. = 'а'][1]
— выберет первый дочерний элемент, текстовое значение которого равно "а
"; □
*[. = 'a'][position mod 2 = 0]
— выберет все дочерние элементы, текстовое значение которых равно "а
", затем из них выберет четные элементы. Сокращенный синтаксис
Пути выборки — это наиболее часто используемые 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
;
Поделиться с друзьями: