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

на главную

Жанры

Технология 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
рейтинг книги
Кодекс Крови. Книга IХ

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

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

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

Кронос Александр
2. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
Мастер Разума II

Идеальный мир для Социопата 4

Сапфир Олег
4. Социопат
Фантастика:
боевая фантастика
6.82
рейтинг книги
Идеальный мир для Социопата 4

Проклятый Лекарь V

Скабер Артемий
5. Каратель
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Проклятый Лекарь V

Live-rpg. эволюция-5

Кронос Александр
5. Эволюция. Live-RPG
Фантастика:
боевая фантастика
5.69
рейтинг книги
Live-rpg. эволюция-5

Сонный лекарь 6

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

Сумеречный стрелок

Карелин Сергей Витальевич
1. Сумеречный стрелок
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок

Мимик нового Мира 8

Северный Лис
7. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 8

Титан империи 4

Артемов Александр Александрович
4. Титан Империи
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Титан империи 4

Бездомыш. Предземье

Рымин Андрей Олегович
3. К Вершине
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Бездомыш. Предземье

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Генерал Скала и сиротка

Суббота Светлана
1. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Генерал Скала и сиротка