то
while(
...,
иначе
Теперь уже совершенно очевидно, как 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;
i--;
}
В этом цикле участвуют две переменные — i
и result
. Функции, использующиеся в этом цикле, запишутся следующим образом:
Именованный шаблон для этого случая будет иметь вид.
<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
.
Цикл
Частным случаем цикла 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
с использованием следующих условных и изменяющих функций:
Шаблон цикла 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 < $n'>