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

на главную

Жанры

Технология XSLT

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

Шрифт:

Следующий листинг демонстрирует предложенный подход.

Листинг 10.5. Преобразование first-then-second.xsl

<xsl:stylesheet

 version="1.0"

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

 xmlns:xalan="http://xml.apache.org/xalan"

 exclude-result-prefixes="xalan">

 <!-- Шаблоны преобразования first -->

 <xsl:template match="a" mode="first">

<b>

<xsl:apply-templates select="@*|node" mode="first"/>

</b>

 </xsl:template>

 <xsl:template match="@*|node" mode="first">

<xsl:copy>

<xsl:apply-templates select="@*|node" mode="first"/>

</xsl:copy>

 </xsl:template>

 <!--
Шаблоны преобразования second -->

 <xsl:template match="@*|node" mode="second">

<xsl:copy>

<xsl:apply-templates select="@*|node" mode="second"/>

</xsl:copy>

 </xsl:template>

 <xsl:template match="b" mode="second">

<c>

<xsl:apply-templates select="@*|node" mode="second"/>

</c>

 </xsl:template>

 <!-- Основное преобразование -->

 <xsl:template match="/">

<!-- Присваиваем переменной а корень входящего документа -->

<xsl:variable name="a" select="/"/>

<!-- Выводим переменную a -->

<xsl:comment> a: </xsl:comment>

<xsl:copy-of select="$a"/>

<!-- Присваиваем переменной b результат обработки переменной a -->

<xsl:variable name="b">

<xsl:apply-templates select="$a" mode="first"/>

</xsl:variable>

<!-- Выводим переменную b -->

<xsl:comment> b: </xsl:comment>

<xsl:copy-of select="$b"/>

<!-- Присваиваем переменной с результат обработки переменной b -->

<xsl:variable name="c">

<xsl:apply-templates select="xalan:nodeset($b)" mode="second"/>

</xsl:variable>

<!--
Выводим переменную c -->

<xsl:comment> c: </xsl:comment>

<xsl:copy-of select="$c"/>

 </xsl:template>

</xsl:stylesheet>

Ход этого преобразования лучше всего прокомментирует полученный результат.

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

<а>

 <a>1</a>

 <a>2</a>

</а>

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

<!-- а: -->

<а>

 <a>1</a>

 <a>2</a>

</а>

<!-- b:-->

<b>

 <b>1</b>

 <b>2</b>

</b>

<!-- с: -->

<с>

 <c>1</c>

 <c>2</c>

</с>

Элементы расширения

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

Пример

Предположим, что при выполнении преобразования в выходящий документ нам необходимо включить информацию о том, когда документ был сгенерирован — добавить элемент вида:

This page was generated at 10:23.

Пожалуй, самым элегантным решением этой задачи будет использование элемента расширения, который копировал бы в выходящий документ текущее время. Иначе говоря, при выполнении шаблона вида:

<xsl:template match="/">

 <!-- ...
– ->

 This page was generated at <ext:time/>.

</xsl:template>

элемент расширения

ext:time
должен быть заменен текущим временем. Ниже мы приведем пример реализации этого элемента для процессора Xalan.

Интерфейс программирования расширений в Xalan требует, чтобы для каждого элемента расширения был определен метод вида:

тип элемент(org.apache.xalan.extensions.XSLProcessorContext context,

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

Ученичество. Книга 1

Понарошку Евгений
1. Государственный маг
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ученичество. Книга 1

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

Вопреки судьбе, или В другой мир за счастьем

Цвик Катерина Александровна
Любовные романы:
любовно-фантастические романы
6.46
рейтинг книги
Вопреки судьбе, или В другой мир за счастьем

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

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

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Мама из другого мира. Дела семейные и не только

Рыжая Ехидна
4. Королевский приют имени графа Тадеуса Оберона
Любовные романы:
любовно-фантастические романы
9.34
рейтинг книги
Мама из другого мира. Дела семейные и не только

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род

Проданная Истинная. Месть по-драконьи

Белова Екатерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Лучший из худших

Дашко Дмитрий
1. Лучший из худших
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Лучший из худших

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

Гром над Академией Часть 3

Машуков Тимур
4. Гром над миром
Фантастика:
фэнтези
5.25
рейтинг книги
Гром над Академией Часть 3

Сила рода. Том 3

Вяч Павел
2. Претендент
Фантастика:
фэнтези
боевая фантастика
6.17
рейтинг книги
Сила рода. Том 3