Технология 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;
Поделиться:
Популярные книги
Приручитель женщин-монстров. Том 12
12. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Элита элит
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Попаданка. Финал
4. Двойная звезда
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Неудержимый. Книга XXIV
24. Неудержимый
Фантастика:
попаданцы
фэнтези
фантастика: прочее
5.00
рейтинг книги
Имперец. Том 5
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Государь
7. Варяг
Фантастика:
альтернативная история
8.93
рейтинг книги
Вперед в прошлое 3
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Неофит
3. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Студент из прошлого тысячелетия
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Начальник милиции. Книга 5
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Имя нам Легион. Том 11
11. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
На границе империй. Том 7. Часть 2
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 8
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Новый Рал 2
2. Рал!
Фантастика:
фэнтези
7.62