В следующем преобразовании шаблон с именем less-than сравнивает значения параметров x и y. Переменной less-than присваивается булевое значение результата сравнения.

Листинг 11.7. Вычисление булевого значения функции

<xsl:stylesheet

 version='1.0'

 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

 <xsl:template match='/'>

  <xsl:variable name='result'>

   <xsl:call-template name='less-than'>

    <xsl:with-param name='x' select='2'/>

    <xsl:with-param name='y' select='1'/>

   </xsl:call-template>

  </xsl:variable>

  <xsl:variable name='less-than' select='boolean(number($result))'/>

  <xsl:value-of select='$less-than'/>

 </xsl:template>

 <xsl:template name='less-than'>

  <xsl:param name='x'/>

  <xsl:param name='y'/>

  <xsl:value-of select='number($x &lt; $y)'/>

 </xsl:template>

</xsl:stylesheet>

Пример

Простым примером шаблона-функции может быть шаблон, который форматирует дату в нужном виде, например 7 августа 93 года как '07-Aug-1993'.

В качестве параметров этот шаблон будет принимать численные значения дня, месяца и года. Год, имеющий значение меньшее 25, мы будем считать принадлежащим новому тысячелетию.

Листинг 11.8. Шаблон, форматирующий дату

<xsl:template name='format-date'>

 <xsl:param name='day'/>

 <xsl:param name='month'/>

 <xsl:param name='year'/>

 <xsl:value-of select='format-number($day, '00')'/>

 <xsl:text>-</xsl:text>

 <xsl:choose>

  <xsl:when test='$month = 1'>Jan</xsl:when>

  <xsl:when test='$month = 2'>Feb</xsl:when>

  <xsl:when test='$month = 3'>Mar</xsl:when>

  <xsl:when test='$month = 4'>Apr</xsl:when>

  <xsl:when test='$month = 5'>May</xsl:when>

  <xsl:when test='$month = 6'>Jun</xsl:when>

  <xsl:when test='$month = 7'>Jul</xsl:when>

  <xsl:when test='$month = 8'>Aug</xsl:when>

  <xsl:when-test='$month = 9'>Sen</xsl:when>

  <xsl:when test='$month = 10'>Oct</xsl:when>

  <xsl:when test='$month = 11'>Nov</xsl:when>

  <xsl:when test='$month = 12'>Dec</xsl:when>

 </xsl:choose>

 <xsl:text>-</xsl:text>

 <xsl:choose>

  <xsl:when test='$year &lt;= 25'>

   <xsl:value-of select='format-number($year +2000, '0000')'/>

  </xsl:when>

  <xsl:otherwise>

   <xsl:value-of select='format-number($year, '0000')'/>

  </xsl:otherwise>

 </xsl:choose>

</xsl:template>

Рекурсия

Отсутствие в XSLT изменяемых переменных (оценим красоту этой тавтологии) как, впрочем, и многое другое, делает этот язык совершенно непохожим на многие классические языки программирования. В этом разделе мы опишем рекурсию [Кормен и др. 2000, Кнут 2000] — чрезвычайно простую, но в то же время исключительно мощную технику, которая в большинстве случаев компенсирует нехватку в XSLT переменных и других процедурных конструкций.

Не вдаваясь в строгие определения дискретной математики, можно сказать, что рекурсия это всего лишь описание объекта или вычисления в терминах самого себя. Пожалуй, самым простым примером рекурсии является факториал, функция, которая математически определяется как:

0!=1

n!=n×(n-1)!

Программа на процедурном языке (например, таком, как Java), вычисляющая факториал совершенно тривиальна:

int factorial(int n) {

 if (n == 0) return 1;

 else return n * factorial(n-1);

}

Попробуем запрограммировать факториал на XSLT. Мы уже научились создавать собственные функции (вернее, конструкции, похожие на них) с помощью одних только именованных шаблонов, значит написать функцию, которая бы вызывала сама себя, будет не так уж и сложно.

Листинг 11.9. Именованный шаблон, вычисляющий факториал

<xsl:template name='factorial'>

 <xsl:param name='n'/>

 <xsl:choose>

  <xsl:when test='$n=0'>1</xsl:when>

  <xsl:otherwise>

   <xsl:variable name='n-1'>

    <xsl:call-template name='factorial'>

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

    </xsl:call-template>

   </xsl:variable>

   <xsl:value-of select='$n * number($n-1)'/>

  </xsl:otherwise>

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

0

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

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