Вход/Регистрация
Технология XSLT
вернуться

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

Шрифт:

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

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

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

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

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

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

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

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

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

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

Примеры:

□ 

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*
.

  • Читать дальше
  • 1
  • ...
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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