то

  действия(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;

 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'>

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату