KnigaRead.com/

Алексей Валиков - Технология XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Алексей Валиков, "Технология 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 — содержит контекстный узел, а также всех его потомков; не содержит узлов атрибутов и пространств имен;

□ ancestor — содержит узлы, которые являются предками контекстного узла;

□ ancestor-or-self — содержит контекстный узел, а также всех его предков;

□ following — содержит узлы, следующие за контекстным узлом, в порядке просмотра документа; не содержит его потомков; не содержит узлов атрибутов и пространств имен;

□ following-sibling — содержит братские узлы контекстного узла, которые следуют за ним в порядке просмотра документа; если контекстный узел является атрибутом или узлом пространства имен, то following-sibling не будет содержать никаких узлов;

□ preceding — содержит узлы, предшествующие контекстному узлу в порядке просмотра документа; не содержит его предков; не содержит узлов атрибутов и пространств имен;

□ preceding-sibling — содержит братские узлы контекстного узла, которые предшествуют ему в порядке просмотра документа; в случае, если контекстный узел является узлом атрибута или пространства имен, preceding-sibling не будет содержать никаких узлов;

□ attribute — содержит атрибуты контекстного узла, если он является элементом; в противном случае не содержит ничего;

□ namespace — содержит узлы пространств имен контекстного узла, если он является элементом; в противном случае не содержит ничего.

Шаг выборки вида ось::node() будет содержать все узлы, принадлежащие этой оси. Например, attribute::node() (или, сокращенно @node()) будет содержать все атрибуты текущего узла.

Для того чтобы понять, как оси навигации расположены в дереве документа, обратимся к рис. 6.9.

Рис. 6.9. Расположение в документе осей навигации

На этом рисунке не показано расположение осей атрибутов и пространств имен вследствие того, что эти оси не имеют в документе физического направления.

Каждая ось имеет базовый тип узла — это тип узла, который считается "главным" в этом направлении навигации. Этот тип устанавливается следующим образом: если ось может содержать узлы элементов, ее базовым типом является элемент, в противном случае базовым типом оси навигации является тип узлов, которые она может содержать.

Кроме того, каждой оси соответствует прямое или обратное направление просмотра, которое определяет, в каком порядке будут перебираться узлы, выбираемые этой осью. Оси навигации, которые содержат узлы, предшествующие в порядке просмотра документа контекстному узлу, имеют обратное направление просмотра, все остальные оси просматриваются в прямом порядке. Поскольку оси как self и parent не могут содержать более одного узла, порядок просмотра для них не играет никакого значения.

Базовые типы узлов и направление их просмотра можно свести в одну таблицу (табл. 6.1).


Таблица 6.1. Базовые типы узлов и направления просмотра осей навигации

Ось навигации Базовый тип узла Направление просмотра self Узел элемента Нет child Узел элемента Прямое parent Узел элемента Нет descendant Узел элемента Прямое descendant-or-self Узел элемента Прямое ancestor Узел элемента Обратное ancestor-or-self Узел элемента Обратное following Узел элемента Прямое following-sibling Узел элемента Прямое preceding Узел элемента Обратное preceding-sibling Узел элемента Обратное attribute Узел атрибута Прямое namespace Узел пространства имен Прямое

Базовый тип влияет на то, как в данном шаге выборки будет выполняться тест узла, а направление просмотра на позицию, которую будет занимать тот или иной узел в данном направлении.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*