В следующем преобразовании шаблон с именем less-than
сравнивает значения параметров x
и y
. Переменной less-than
присваивается булевое значение результата сравнения.
<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 < $y)'/>
</xsl:template>
</xsl:stylesheet>
Простым примером шаблона-функции может быть шаблон, который форматирует дату в нужном виде, например 7 августа 93 года как '07-Aug-1993
'.
В качестве параметров этот шаблон будет принимать численные значения дня, месяца и года. Год, имеющий значение меньшее 25, мы будем считать принадлежащим новому тысячелетию.
<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 <= 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
Не вдаваясь в строгие определения дискретной математики, можно сказать, что рекурсия это всего лишь описание объекта или вычисления в терминах самого себя. Пожалуй, самым простым примером рекурсии является факториал, функция, которая математически определяется как:
0!=1
Программа на процедурном языке (например, таком, как Java), вычисляющая факториал совершенно тривиальна:
int factorial(int n) {
if (n == 0) return 1;
else return n * factorial(n-1);
}
Попробуем запрограммировать факториал на XSLT. Мы уже научились создавать собственные функции (вернее, конструкции, похожие на них) с помощью одних только именованных шаблонов, значит написать функцию, которая бы вызывала сама себя, будет не так уж и сложно.
<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>