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

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

Жанры

Технология XSLT

Валиков Алексей Н.

Шрифт:

 i--;

}

В этом цикле участвуют две переменные —

i
и
result
. Функции, использующиеся в этом цикле, запишутся следующим образом:

условие($1, $result) ::= ($i != 0)

функцияi($i, $result) ::= ($i - 1)

функцияresult($i, $result) ::= ($i * $result)

результат($I, $result) ::= ($result)

Именованный

шаблон для этого случая будет иметь вид.

Листинг 11.11. Пример шаблона цикла while

<xsl:template name="while">

 <xsl:param name="i"/>

 <xsl:param name="result"/>

 <xsl:choose>

<xsl:when test="$i != 0">

<xsl:call-template name="while">

<xsl:with-param name="i" select="$i — 1"/>

<xsl:with-param name="result" select="$result * $i"/>

</xsl:call-template>

</xsl:when>

<xsl:otherwise>

<xsl:value-of select="$result"/>

</xsl:otherwise>

 </xsl:choose>

</xsl:template>

Вызвать этот шаблон можно следующим образом:

<xsl:template match="/">

 <xsl:call-template name="while">

<xsl:with-param name="i" select="6"/>

<xsl:with-param name="result" select="1"/>

 </xsl:call-template>

</xsl:template>

Результатом будет, естественно, число

720
.

Цикл for

Частным случаем цикла

while
является цикл
for
. В разных языках программирования
for
имеет различную семантику; мы будем рассматривать циклы
for
вида

for (int i = 0; i < n; i++) { ... }

в языках Java и С или

for i := 0 to n-1 do begin ... end;

в Pascal. Иными словами, нас будет интересовать циклическое выполнение определенных действий при изменении значения некоторой переменной (называемой иногда индексом цикла) в интервале целых чисел от 0 до n включительно.

Цикл

for
может быть определен через
while
с использованием следующих условных и изменяющих функций:

условие($i, $n,$x1,...,$хk) :: = ($i < $n)

функцияi($i, $n, $x1, ... , $xk) ::= ($i + 1)

функцияn($i, $n, $x1, ..., $xk) :: = ($n)

Шаблон

цикла
for
в общем виде будет выглядеть как.

Листинг 11.12. Шаблон цикла for в общем виде

<xsl:template name="for">

 <xsl:param name="i" select="0"/>

 <xsl:param name="n"/>

 <!-- Другие переменные -->

 <xsl:param name="x1"/>

 <!-- ...
– ->

 <xsl:param name="xk"/>

 <xsl:choose>

<xsl:when test="$i &lt; $n">

<!-- Действия -->

<xsl:call-template name="for">

<xsl:with-param name="i" select="$i + 1"/>

<xsl:with-param name="n" select="$n"/>

<!-- Другие переменные -->

<xsl:with-param" name="x1" select функция1($i, $n, $x1, ..., $xk) "/>

<!-- ...
– ->

<xsl:with-param name="xk" select="функцияk($i, $n, $x1, ..., $xk)"/>

</xsl:call-template>

</xsl:when>

<xsl:otherwise>

<xsl:value-of select="результат($i,$n,$x1,...,$xk)"/>

</xsl:otherwise>

 </xsl:choose>

</xsl:template>

В качестве примера цикла

for
приведем шаблон, вычисляющий
n
первых чисел Фибоначчи.

Числа Фибоначчи — это рекуррентная последовательность вида

1 1 2 3 5 8 13 21 ...

и так далее, где каждое последующее число определяется как сумма двух предыдущих.

Для вычисления

n
первых чисел Фибоначчи мы можем использовать две переменные
current
и
last
, соответствующих текущему число и числу, полученному на предыдущем шаге соответственно. Функции, переопределяющие эти переменные, совершенно очевидны:

функцияlast($i, $n, $last, $current) ::= ($current)

функцияcurrent($i, $n, $last, $current) ::= ($current + $last)

Поделиться:
Популярные книги

Я не князь. Книга XIII

Дрейк Сириус
13. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я не князь. Книга XIII

Мастер порталов

Лисина Александра
8. Гибрид
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер порталов

Испытание золотом

Распопов Дмитрий Викторович
6. 30 сребреников
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Испытание золотом

Эволюция мага

Лисина Александра
2. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эволюция мага

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

Я еще барон. Книга III

Дрейк Сириус
3. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще барон. Книга III

Ну, здравствуй, перестройка!

Иванов Дмитрий
4. Девяностые
Фантастика:
попаданцы
альтернативная история
6.83
рейтинг книги
Ну, здравствуй, перестройка!

Испытание Системы III

Котов Артём
3. Испытания системы
Фантастика:
попаданцы
рпг
фэнтези
фантастика: прочее
5.00
рейтинг книги
Испытание Системы III

Купец из будущего 2

Чайка Дмитрий
2. Третий Рим
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Купец из будущего 2

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Идеальный мир для Демонолога 11

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

Кодекс Охотника XXXI

Винокуров Юрий
31. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника XXXI

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

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

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

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