Книга: Технология XSLT
Предикаты
Предикаты
При выборе узлов каждый шаг выборки может иметь один или несколько предикатов, которые будут фильтровать выбираемое множество узлов. Предикат — это логическое выражение, вычисляемое для. каждого узла выбранного множества, и только в том случае, если результатом является истина, узел остается в фильтруемом множестве.
Продукция предиката, 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]
— выберет все дочерние элементы, текстовое значение которых равно "а
", затем из них выберет четные элементы.
- Другие предикаты сравнения
- Предикаты: наборы узлов
- Образцы шага, часть 3: предикаты
- Предикаты: логические значения
- ГЛАВА 21. Выражения и предикаты.
- Предикаты: фрагменты результирующего дерева
- ГЛАВА 6. ВСТРОЕННЫЕ ПРЕДИКАТЫ
- Предикаты существования
- 7.1.1. Предикаты var, nоnvar, atom, integer, atomic
- Совет 39. Реализуйте предикаты в виде «чистых» функций
- Специальные встроенные предикаты
- Дополнительные встроенные предикаты