Технология 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;
Поделиться:
Популярные книги
Толян и его команда
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Кодекс Крови. Книга IХ
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума II
2. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
Идеальный мир для Социопата 4
4. Социопат
Фантастика:
боевая фантастика
6.82
рейтинг книги
Проклятый Лекарь V
5. Каратель
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Live-rpg. эволюция-5
5. Эволюция. Live-RPG
Фантастика:
боевая фантастика
5.69
рейтинг книги
Сонный лекарь 6
6. Сонный лекарь
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок
1. Сумеречный стрелок
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мимик нового Мира 8
7. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Титан империи 4
4. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Бездомыш. Предземье
3. К Вершине
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Возвышение Меркурия. Книга 16
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Генерал Скала и сиротка
1. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.40