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

на главную - закладки

Жанры

Технология XSLT

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

Шрифт:

□ Тест узла

'node'
выполняется для любого узла. Шаг выборки вида
ось::node
выберет все узлы, принадлежащие данной оси.

Примеры:

□ 

child::node
— выберет все дочерние узлы контекстного узла;

□ 

child::*
— выберет дочерние элементы контекстного узла;

□ 

attribute::*
— выберет атрибуты контекстного узла;

□ 

xsl:*
выберет все дочерние элементы контекстного узла, принадлежащие пространству имен с префиксом
xsl
;

□ 

xsl:template
— выберет все дочерние элементы
template
контекстного узла, принадлежащие пространству имен с префиксом
xsl
;

□ 

comment
— выберет все дочерние узлы комментариев;

□ 

self::comment
— выберет контекстный узел, если он является комментарием, или пустое множество в противном случае;

□ 

descendant::processing-instruction
— выберет все узлы инструкций по обработке, которые являются потомками контекстного узла;

□ 

following::processing-instruction('арр')
— выберет все узлы инструкций по обработке с целевым приложением "
app
", которые следуют за контекстным узлом в порядке просмотра документа.

Тест узла показывает, какого типа узлы мы ищем. Комментарии? Текстовые узлы? Узлы с определенными именами или принадлежащие определенному пространству имен? Или подойдут любые узлы?

Итак, ось навигации позволяет указывать направления шага по дереву документа, тест узла — тип или имя выбираемого узла. Третья часть шага выборки (один или несколько предикатов) позволяет дополнять эти критерии логическими условиями, которые должны выполняться для выбираемых на данном шаге узлов.

Предикаты

При выборе узлов каждый шаг выборки может иметь один или несколько предикатов, которые будут фильтровать выбираемое множество узлов. Предикат — это логическое выражение, вычисляемое для. каждого узла выбранного множества, и только в том случае, если результатом является истина, узел остается в фильтруемом множестве.

Продукция предиката,

Predicate
, определяется следующим образом:

[XP8] Predicate ::= '[' PredicateExpr ']'

[XP9] PredicateExpr ::= Expr

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

Predicate ::= '[' Expr ']'

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

Фильтрация множества узлов выполняется следующим образом.

□ Фильтруемое множество сортируется в направлении просмотра оси навигации

данного шага. Для осей
ancestor
,
ancestor-or-self
,
preceding
,
preceding-sibling
фильтруемое множество сортируется в обратном порядке просмотра документа, для остальных осей — в прямом порядке просмотра.

□ Выражение предиката вычисляется для каждого узла отсортированного множества в следующем контексте.

 • Фильтруемый узел (тот, для которого в данный момент вычисляется предикат) становится контекстным узлом.

 • Количество узлов фильтруемого множества становится размером контекста.

 • Позиция фильтруемого узла в отсортированном множестве становится позицией контекста.

□ Результат вычисления предиката преобразуется в булевый тип согласно следующим правилам.

 • Если результатом вычисления является число, равное позиции контекста, булевым значением предиката будет

true
, в противном случае —
false
. Например, предикат
[2]
равносилен предикату
[position=2]
— он обратится в истину только для второго узла фильтруемого множества.

 • Все остальные типы данных приводятся к булевому типу в соответствии со стандартными правилами (см. также раздел "Типы данных" настоящей главы).

□ Из фильтруемого множества исключаются все узлы, булевое значение предиката для которых было ложью.

□ В случае, если в шаге выборки было несколько предикатов, процедура фильтрации повторяется с каждым из них, оставляя в отфильтрованном множестве только те узлы, для которых каждый из предикатов будет истиной.

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

Примеры:

□ 

a[1]
— выберет первый в порядке просмотра документа дочерний элемент
а
контекстного узла;

□ 

a[position mod 2 = 0]
— выберет все четные дочерние элементы
а
;

□ 

*[. = 'а']
— выберет все дочерние элементы, текстовое значение которых равно "
а
";

□ 

*[name = 'a']
— выберет все дочерние элементы, имя которых равно "
а
";

□ 

*[starts-with(name, 'a')]
— выберет все дочерние элементы, имя которых начинается с "
а
";

□ 

*[. = 'а'][1]
— выберет первый дочерний элемент, текстовое значение которого равно "
а
";

□ 

*[. = 'a'][position mod 2 = 0]
— выберет все дочерние элементы, текстовое значение которых равно "
а
", затем из них выберет четные элементы.

Сокращенный синтаксис

Поделиться:
Популярные книги

(Не)зачёт, Дарья Сергеевна!

Рам Янка
8. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
(Не)зачёт, Дарья Сергеевна!

Отмороженный 13.0

Гарцевич Евгений Александрович
13. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 13.0

Идеальный мир для Лекаря 18

Сапфир Олег
18. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 18

Последний Герой. Том 4

Дамиров Рафаэль
Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 4

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

Гримуар темного лорда III

Грехов Тимофей
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда III

Локки 4 Потомок бога

Решетов Евгений Валерьевич
4. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Локки 4 Потомок бога

Газлайтер. Том 6

Володин Григорий
6. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 6

Капитан космического флота

Борчанинов Геннадий
2. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
рпг
5.00
рейтинг книги
Капитан космического флота

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

Вперед в прошлое 5

Ратманов Денис
5. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 5

Третий Генерал: Том IV

Зот Бакалавр
3. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Третий Генерал: Том IV

Третий. Том 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 4