Книга: Технология XSLT
Тесты узлов
Тесты узлов
Вторая часть шага выборки, тест узла, оставляет из множества, которое содержит ось навигации, только узлы, соответствующие определенному типу или имеющие определенные имена.
Продукция NodeTest
, соответствующая тесту узла, определяется следующим образом:
[XP7] NodeTest ::= NameTest
| NodeType '(' ')'
| 'processing-instruction' '(' Literal ')'
Раскрыв продукции NameTest
и NodeType
, EBNF-синтаксис теста узла можно переписать в упрощенном виде:
NodeTest ::= '*'
| NCName:*
| QName
| 'comment()'
| 'text()'
| 'processing-instruction'
| 'processing-instruction' '(' Literal ')'
| 'node()'
Рассмотрим подробно каждый случай.
? Тест узла '*'
выполняется для любого узла, тип которого является базовым типом оси навигации данного шага выборки. Иными словами, шаг выборки attribute::*
или @*
выберет все атрибуты контекстного узла, а namespace::*
— все узлы пространств имен. Для всех остальных осей тест *
будет выбирать узлы элементов, принадлежащих данной оси.
? Тест узла вида 'NCName:*'
выполняется для узлов определенного пространства имен. Этот тест имеет вид префикс:*
, где префикс
соответствует проверяемому пространству (он должен быть определен в контексте вычисляемого шага выборки). Этот тест выполняется для всех узлов пространства имен, которое соответствует префиксу вне зависимости от локальной части имени.
? Тест вида QName
выполняется для узлов базового типа, которые имеют расширенные имена, равные QName
. Если в QName
не указан префикс, то тест будет выполняться для узлов с соответствующим именем и нулевым пространством имен. В случае, если префикс указан, узел будет удовлетворять тесту, если его пространство имен будет совпадать с пространством имен, которое соответствует префиксу, а локальная часть имени будет равна локальной части QName
.
? Тест 'comment()'
выполняется для любого узла комментария.
? Тест 'text()'
выполняется для любого текстового узла.
? Тест узла 'processing-instruction()'
выполняется для любого узла инструкции по обработке.
? Тест 'processing-instruction (' Literal ')'
, или, в упрощенном виде processing-instruction(строка)
выполняется для инструкций по обработке, имеющих имя, равное строковому параметру этого теста узла.
? Тест узла 'node()'
выполняется для любого узла. Шаг выборки вида ось::node()
выберет все узлы, принадлежащие данной оси.
Примеры:
? child::node()
— выберет все дочерние узлы контекстного узла;
? child::*
— выберет дочерние элементы контекстного узла;
? attribute::*
— выберет атрибуты контекстного узла;
? xsl:*
— выберет все дочерние элементы контекстного узла, принадлежащие пространству имен с префиксом xsl
;
? xsl:template
— выберет все дочерние элементы template
контекстного узла, принадлежащие пространству имен с префиксом xsl
;
? comment()
— выберет все дочерние узлы комментариев;
? self::comment()
— выберет контекстный узел, если он является комментарием, или пустое множество в противном случае;
? descendant::processing-instruction()
— выберет все узлы инструкций по обработке, которые являются потомками контекстного узла;
? following::processing-instruction('арр')
— выберет все узлы инструкций по обработке с целевым приложением "app
", которые следуют за контекстным узлом в порядке просмотра документа.
Тест узла показывает, какого типа узлы мы ищем. Комментарии? Текстовые узлы? Узлы с определенными именами или принадлежащие определенному пространству имен? Или подойдут любые узлы?
Итак, ось навигации позволяет указывать направления шага по дереву документа, тест узла — тип или имя выбираемого узла. Третья часть шага выборки (один или несколько предикатов) позволяет дополнять эти критерии логическими условиями, которые должны выполняться для выбираемых на данном шаге узлов.
- Операции с множествами узлов
- Удаление шаблонов узлов STP
- Создание узлов
- Управление объединением содержимого узлов
- Предикаты: наборы узлов
- 1.2.5. Диаграммы дерева узлов и FEO
- Описание узлов с помощью MAC-адресов
- Поддержка защищенных Web-узлов
- Компонентные тесты
- Создание узлов элементов
- Сводная таблица характеристик узлов
- Перечисление узлов