Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Тогда продукцию StepPattern
тоже можно переписать:
StepPattern ::= NodeTest Predicate*
| '@' NodeTest Predicate*
| 'child::' NodeTest Predicate*
| 'attribute::' NodeTest Predicate*
Теперь стало совершенно очевидно, что шаг паттерна это не что иное, как подмножество шагов выборки, в которых ограничено множество осей навигации.
Таким образом, синтаксически паттерны отличаются от путей выборки тем, что в них можно использовать только две оси навигации (не считая descendant-or-self
в виде оператора), но зато можно в качестве узла отсчета использовать узел, выбранный по своему уникальному атрибуту или по значению ключа.
Паттерны могут использоваться в XSLT в следующих атрибутах:
□ атрибуты count
и from
элемента xsl:number
;
□ атрибут match
элемента xsl:key
;
□ атрибут match
элемента xsl:template
.
Последние два случая паттернов отличаются от первого тем, что в них нельзя использовать переменные. Определение вида
...
будет некорректным.
Семантика паттернов
Остановимся подробнее на вопросе — что же означает "соответствие узла некоторому паттерну".
Прежде всего, заметим, что любой паттерн является также и XPath-выражением. Тогда строгое определение соответствия узла паттерну можно дать следующим образом.
Узел X
соответствует паттерну P
тогда и только тогда, когда существует такой узел Y
, принадлежащий оси ancestor-or-self
узла X
, что множество, получаемое в результате вычисления выражения P
в контексте узла Y
будет содержать узел X
.
Рассмотрим это определение на примере паттерна body//а
. Строго говоря, узел будет соответствовать этому паттерну, если во множестве его предков (плюс сам узел) найдется такой узел, что множество body//а
, вычисленное в его контексте, будет содержать проверяемый узел. На практике первые два элемента а
приведенного ниже документа соответствуют этому паттерну, потому что существует элемент html
, содержащий элемент body
, потомками которого эти элементы а
являются.
<���а>
</а>
Существует также и более простое определение соответствия. Узел X
соответствует паттерну P
тогда и только тогда, когда X
принадлежит множеству //P
. В приведенном выше примере паттерну body//а
соответствуют все узлы множества //body//а
.
Эти определения эквивалентны. На практике следует пользоваться тем, которое кажется более понятным.
Примеры паттернов
□ body
— соответствует элементам body
с нулевым пространством имен;
□ xhtml:body
— соответствует элементам body
, принадлежащим пространству имен с префиксом xhtml
;
□ body/a
— соответствует дочерним элементам а
элемента body
;
□ *
— соответствует любому элементу, который принадлежит нулевому пространству имен;
□ а[1]
— соответствует каждому первому элементу а
своего родительского узла; элемент будет соответствовать этому паттерну, если ему не предшествует никакой братский элемент a
— то есть из всех дочерних элементов а
некоторого узла этому паттерну будет соответствовать только первый в порядке просмотра документа элемент;
□ a[position() mod 2 = 0]
— соответствует каждому четному элементу a
своего родительского узла; иначе говоря, из всех элементов а
некоторого узла этому паттерну будут соответствовать только четные;
□ /
— соответствует корневому узлу;
□ /html
— узел будет соответствовать этому паттерну тогда и только тогда, когда он является элементом с именем html
и нулевым пространством имен и находится при этом в корне элемента;
□ //html
— соответствует любому элементу html
документа, принадлежащему нулевому пространству имен; этот паттерн равносилен паттерну html
;
□ *[starts-with(local-name(), 'A') or starts-with(local-name(), 'a')]
— соответствует любому элементу, имя которого начинается на букву "а"
в любом регистре символов;
□ *[string-length(local-name())=2]
— соответствует любому элементу, локальная часть имени которого состоит из двух символов;
□ *[starts-with(namespace-uri(),'http') or starts-with(namespace-uri(), 'HTTP')]
— соответствует любому элементу, URI пространства имен которого начинается на "http"
или "HTTP"
;
□ br[not(*)]
— соответствует элементу br
, который не имеет дочерних элементов;
□ id('i')
— соответствует элементу, уникальный атрибут которого (атрибут, имеющий тип ID
) равен "i"
;
□ id('i')/@id
— соответствует атрибуту id
элемента, уникальный атрибут которого равен "i"
; заметим, что уникальный атрибут элемента вовсе не обязательно должен иметь имя id
;
□ key('name', 'html')/@href
— соответствует атрибуту href
узла, значение ключа с именем "name"
которого равно "html"
;
□ *|@*
— соответствует любому элементу или атрибуту;
□ a|b|с
— соответствует элементам а
, b
и с
;
□ node()
— соответствует любому узлу, кроме узла атрибута и пространства имен (поскольку они не являются дочерними узлами своих родителей);
□ node() | attribute::* | namespace::*
— соответствует любому узлу, включая узлы атрибутов и пространств имен;
□ node()[not(self::text())]
— соответствует любому узлу, кроме текстового узла, узла атрибута и узла пространства имен.
Выражения
Выражения XPath являются наиболее общими конструкциями этого языка. Пути выборки, разобранные ранее, — это всего лишь частный случай выражения. Выражения включают в себя арифметические и логические операции, вызов функций, операции с путями выборки и так далее.
Выражениям языка соответствует нетерминал Expr
. И хотя синтаксическое правило, определяющее этот нетерминал, записывается очень просто, в данный момент оно нам абсолютно ничего не скажет.
Базовая конструкция, использующаяся в выражениях, называется первичным выражением (от англ. primary expression). Первичные выражения могут быть переменными, литералами, числами, вызовами функций, а также обычными выражениями Expr, сгруппированными в круглых скобках:
[XP15] PrimaryExpr ::= VariableReference
| '(' Expr ')'
| Literal
| Number
| FunctionCall
Переменные
Переменные вызываются в выражениях XPath по своему имени, которому предшествует символ " $
". Например, если мы объявили переменную nodes
:
то использовать в выражениях мы ее будем как $nodes
.
Переменные, так же как элементы и атрибуты XML, могут иметь расширенные имена вида QName
, состоящие из префикса пространства имен и локальной части имени. Это позволяет создавать переменные, принадлежащие различным пространствам имен.
Интервал:
Закладка: