Технология XSLT
Шрифт:
Весомым ограничением такого рода циклической обработки является невозможность генерировать множества узлов. В текущей версии языка никакой другой тип не может быть приведен ко множеству узлов, значит, в любое из них могут входить только те узлы, которые изначально присутствуют в одном из обрабатываемых документов. Это означает, что ни
xsl:apply-templates
, ни xsl:for-each
не могут быть использованы для того, чтобы реализовать простые while
– или for
– циклы для произвольных множеств. Цикл while
Наиболее
while
(англ. пока). Цикл while
, как правило, имеет следующий вид: пока
верно условие
выполнять
действия
В качестве примера
while
– цикла напишем на языке Java программу вычисления факториала в итеративном стиле: int factorial(int n) {
int i = n;
int result = 1;
while (i != 0) {
result = result * i;
i--;
}
return result;
}
В этой функции
условием
является отличие значения переменной i
от 0, а действиями — умножение значения переменной result
на значение переменной i
, и уменьшение значения этой переменной на 1. Цикл
while
не может быть запрограммирован в XSLT итеративно потому как действия, как правило, изменяют значения переменных, в контексте которых вычисляется условие, определяющее, продолжать выполнение цикла или нет. Дадим другую общую запись цикла while
, выделив изменение переменных: пока
верно условие(x1,x2, ...,xn)
выполнить
x1' := функция1(x1,x2,...,xn)
х2' := функция2(x1,x2,...,xn)
...
xn' := функцияn(x1,x2,...,xn)
действия(x1,x2,...,хn)
x1 := x1'
x2 := x2'
...
xn := xn'
иначе
вернуть результат(x1,...,хn)
Переопределение
x
1, … , х
n в этом случае выполняют n
функций: функция
1 …, функция
n. И если изменить значение переменной мы не могли, переопределить связанное с ней значение мы вполне в состоянии, добавив в контекст новый параметр или переменную с тем же именем. Теперь мы можем записать весь цикл
while
как одну рекурсию: while(x1, ..., xn) ::=
если
выполняется условие(x1, ..., xn)
то
действия(x1, ..., хn)
while(функция1(x1, ..., хn),
функция2(x1, ..., хn),
...,
функцияn(x1, ..., xn))
иначе
результат(x1, ..., хn)
Теперь уже совершенно очевидно, как
while
– цикл должен выглядеть в преобразовании. Листинг 11.10. Шаблон цикла while в общем виде
<xsl:template name="while">
<xsl:param name="x1"/>
<!-- ...
– ->
– ->
<xsl:param name="xn"/>
<xsl:choose>
<xsl:when test="условие($x1,...,$xn)">
<!-- Действия -->
<xsl:call-template name="while">
<xsl:with-param name="x1" select="функция_1($x1, ... $xn) "/>
<!-- ...
– ->
– ->
<xsl:with-param name="xn" select="функция_n($x1, ... $xn) "/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="результат($x1, ..., $xn)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
В качестве примера приведем
while
– цикл для программы, вычисляющей факториал. Java-код был следующим: while (i != 0) {
result = result * i;
Поделиться:
Популярные книги
Попаданка в академии драконов 4
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Амазония
101. Книга-загадка, книга-бестселлер
Приключения:
прочие приключения
9.34
рейтинг книги
Сыночек в награду. Подари мне любовь
1. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Найди меня Шерхан
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Боярышня Евдокия
3. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совершенный: Призрак
2. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Разбуди меня
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Часовая битва
6. Часодеи
Детские:
детская фантастика
9.38
рейтинг книги
Прометей: каменный век II
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Третье правило дворянина
3. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Курсант: назад в СССР 2
2. Курсант
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Безумный Макс. Ротмистр Империи
2. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
4.67
рейтинг книги
Метаморфозы Катрин
Фантастика:
фэнтези
8.26
рейтинг книги
Новый Рал 7
7. Рал!
Фантастика:
попаданцы
5.00