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

на главную - закладки

Жанры

Технология 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
рейтинг книги
Приручитель женщин-монстров. Том 12

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит

Попаданка. Финал

Ахминеева Нина
4. Двойная звезда
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Попаданка. Финал

Неудержимый. Книга XXIV

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

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Государь

Мазин Александр Владимирович
7. Варяг
Фантастика:
альтернативная история
8.93
рейтинг книги
Государь

Вперед в прошлое 3

Ратманов Денис
3. Вперёд в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 3

Неофит

Листратов Валерий
3. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неофит

Студент из прошлого тысячелетия

Еслер Андрей
2. Соприкосновение миров
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Студент из прошлого тысячелетия

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5

Имя нам Легион. Том 11

Дорничев Дмитрий
11. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 11

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

На границе империй. Том 8

INDIGO
12. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8

Новый Рал 2

Северный Лис
2. Рал!
Фантастика:
фэнтези
7.62
рейтинг книги
Новый Рал 2