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

на главную

Жанры

Технология XSLT

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

Шрифт:

Поскольку в данном случае нам не нужно возвращать результат, нужно лишь циклически выводить очередное число Фибоначчи, шаблон

for
может быть немного упрощен использованием элемента
xsl:if
вместо
xsl:choose
.

Листинг 11.13. Шаблон, вычисляющий числа Фибоначчи

<xsl:template name="for">

 <xsl:param name="i" select="0"/>

 <xsl:param name="n"/>

 <xsl:param name="last" select="0"/>

 <xsl:param name="current" select="1"/>

 <xsl:if test="$i &lt; $n">

<xsl:text> </xsl:text>

<xsl:value-of select="$current"/>

<xsl:call-template name="for">

<xsl:with-param name="i" select="$i + 1"/>

<xsl:with-param name="n" select="$n"/>

<xsl:with-param name="last" select="$current"/>

<xsl:with-param name="current" select="$last + $current"/>

</xsl:call-template>

 </xsl:if>

/xsl:template>

Вызванный

в основном шаблоне как:

<xsl:template match="/">

 <xsl:call-template name="for">

<xsl:with-param name="n" select="6"/>

 </xsl:call-template>

</xsl:template>

этот шаблон создаст в выходящем документе последовательность:

1 1 2 3 5 8

Приведем еще более простой пример, в котором элемент

option
выводится заданное число раз.

Листинг 11.14. Вывод 10 элементов option

<xsl:stylesheet

 version="1.0"

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

 <xsl:template match="/">

<xsl:call-template name="for">

<xsl:with-param name="n" select="10"/>

</xsl:call-template>

 </xsl:template>

 <xsl:template name="for">

<xsl:param name="i" select="0"/>

<xsl:param name="n"/>

<xsl:if test="$i &lt; $n">

<option>

<xsl:value-of select="$i"/>

</option>

<xsl:call-template name="for">

<xsl:with-param name="i" select="$i + 1"/>

<xsl:with-param name="n" select="$n"/>

</xsl:call-template>

</xsl:if>

 </xsl:template>

</xsl:stylesheet>

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

<option>0</option>

<option>1</option>

<option>2</option>

<option>3</option>

<option>4</option>

<option>5</option>

<option>6</option>

<option>7</option>

<option>8</option>

<option>9</option>

Пожалуй,

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

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

Метод Пиза для for-цикла

Для простых

for
– циклов, которые должны выполниться строго определенное число раз, вместо рекурсии можно использовать весьма остроумный метод, предложенный Венделлом Пизом (Wendell Piez, Mullberry Technologies, Inc). Суть метода состоит в том, что хоть мы и не можем сгенерировать множество узлов, выбрать множество с определенным количеством узлов нам вполне по силам.

Для начала выберем какое-нибудь множество узлов документа преобразования:

<xsl:variable name="set" select="document('')//node"/>

Затем для повторения определенных действий несколько раз используем конструкцию вида

<xsl:for-each select="$set[position &lt;= $number]">

 <!-- Действия -->

</xsl:for-each>

где

number
указывает требуемое число итераций.

При использовании метода Пиза следует учитывать следующие особенности.

□ Множество узлов

set
не должно быть слишком большим — иначе его выбор будет неэффективным.

□ Множество узлов

set
обязательно должно содержать число итераций (
number
) узлов.

В целом же метод Пиза — классический пример эффективного применения инструментов не по назначению.

Операции над множествами

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

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

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Маяк надежды

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

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6