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

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

Жанры

Технология XSLT

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

Шрифт:

Дело в том, что структуры XML-документов (даже принадлежащих одной логической схеме) могут быть настолько разнообразны, что создание императивной программы, которая выполняла бы их преобразование, является очень сложной задачей. Возможность включения или исключения тех или иных элементов, наличие или отсутствие атрибутов, да и неопределенность самой структуры документа в конечном итоге приводят к экспоненциальному увеличению количества операторов ветвления, циклов и так далее. Программа становится большой, сложной и малопонятной.

В то же время само преобразование может быть очень простым. Не понимая, что нужно сделать, чтобы преобразовать

документ целиком, тем не менее, можно хорошо понимать, как следует обработать каждую из его частей.

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

Определение шаблонного правила

Элемент xsl:template

Синтаксис этого элемента приведен ниже:

<xsl:template

 match="пaттерн"

 name="имя"

 priority="число"

 mode="имя">

 <!-- Содержимое: несколько элементов xsl:param, тело шаблона -->

</xsl:template>

Элемент верхнего уровня

xsl:template
определяет в преобразовании шаблонное правило, или просто шаблон. Элемент
xsl:template
имеет всего четыре атрибута, смысл которых мы кратко опишем ниже.

Атрибут

match
задает паттерн — образец узлов дерева, для преобразования которых следует применять этот шаблон.

Пример

<xsl:template match="bold">

 <b><xsl:value-of select="."/></b>

</xsl:template>

В этом правиле атрибут

match
говорит о том, что оно должно использоваться для обработки элементов
bold
— в данном случае они будут заменяться на элементы
b
. Шаблоны, в которых определен атрибут
match
, вызываются при помощи инструкции
xsl:apply-templates
.

Шаблон также может иметь имя, определяемое атрибутом

name
. Шаблон, в котором задано имя, называется именованным шаблоном. Именованные шаблоны могут вызываться вне зависимости от текущего контекста, и даже вести себя как функции — принимать на вход параметры и возвращать некоторые значения.

Пример

<xsl:template name="bold">

 <b><xsl:value-of select="."/></b>

</xsl:template>

В

отличие от предыдущего примера, это правило не будет обрабатывать какие-либо определенные узлы. Вызвать его можно будет только по имени посредством элемента
xsl:call-template
.

При определении шаблона нужно обязательно указать хотя бы один из атрибутов

match
или
name
, причем эти атрибуты могут присутствовать в
xsl:template
одновременно.

Атрибут

mode
определяет режим данного шаблонного правила. Режимы позволяют задавать различные преобразования для одних и тех же частей документа (о них мы поговорим позже).

Атрибут

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

Атрибуты шаблонного правила не влияют на выполнение его содержимого. Они используются элементами

xsl:apply-templates
и
xsl:call-template
при выборе шаблонов. Правила, которые были импортированы в преобразование, вызываются элементом
xsl:apply-imports
.

Вызов шаблонных правил

Рассмотрим следующий простой пример.

Листинг 5.1. Входящий документ

<para><bold>text</bold></para>

Попробуем написать пару шаблонов, которые будут изменять имена элементов

para
и
bold
на
p
и
b
соответственно. Сначала напишем преобразование для
bold
:

<xsl:template match="bold">

<b><xsl:value-of select="."/></b>

</xsl:template>

В этом правиле создается элемент

b
, в который включается текстовое значение текущего узла (то есть, обрабатываемого элемента
bold
). Применив это преобразование к входящему документу, мы получим следующий результат:

<b>text</b>

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

para
и создадим преобразование, включающее оба правила.

Листинг 5.2. Преобразование с para и bold — версия 1

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:template match="bold">

<b><xsl: value-of select="."/></b>

 </xsl:template>

 <xsl:template match="para">

<xsl:value-of select="."/>

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

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

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

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль

Новик

Ланцов Михаил Алексеевич
2. Помещик
Фантастика:
альтернативная история
6.67
рейтинг книги
Новик

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

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

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Испытание системы

Котов Артем
Фантастика:
постапокалипсис
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Испытание системы

Неудержимый. Книга XXII

Боярский Андрей
22. Неудержимый
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Неудержимый. Книга XXII

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3

Лейтенант. Часть 2. Назад в СССР

Гаусс Максим
9. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Лейтенант. Часть 2. Назад в СССР

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Ведьмак. Назад в СССР

Подус Игорь
1. Ведьмак: назад в СССР
Фантастика:
попаданцы
альтернативная история
6.60
рейтинг книги
Ведьмак. Назад в СССР

Прайм. Хомори

Бор Жорж
2. Легенда
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Прайм. Хомори

Боец с планеты Земля

Тимофеев Владимир
1. Потерявшийся
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Боец с планеты Земля