Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

| '/' RelativeLocationPath

| '//' RelativeLocationPath

Таким образом, путь выборки имеет четыре основных варианта, которые мы сейчас и разберем:

□ путь

'/'
— используется для обращения к корневому узлу дерева;

□ путь вида

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
— содержит контекстный узел, а также всех его потомков; не содержит узлов атрибутов и пространств имен;

Поделиться с друзьями: