Рекурсивный вызов шаблонов
Рекурсивный вызов шаблонов
Эта тема предназначена, главным образом, для программистов, поскольку здесь я буду пользоваться XSLT как языком программирования. В частности, я реализую вызов именованным шаблоном самого себя, то есть рекурсивный вызов. Классический пример рекурсии — вычисление факториала: например, факториал 6, что записывается как 6!, равен 6*5*4*3*2*1, или 720.
При реализации рекурсии в настоящем языке программирования создается функция — например, factorial, которая вызывается со значением 6: factorial(6). Факториал 6 вычисляется как 6 * factorial(5), поэтому функции нужно лишь умножить на 6 результат вызова самой себя со значением 5, то есть factorial(5).
Далее, factorial(5) — это 5*factorial(4), поэтому функция снова вызывает сама себя, чтобы вычислить значение factorial(4). Этот процесс продолжается до вычисления factorial(1), а мы знаем, что 1! — это просто 1, поэтому factorial(1) возвращает 1. С этого момента управление последовательно возвращается на все предыдущие этапы, в результате чего будет вычислено выражение 1*2*3*4*5*6, или 720, что составляет 6!.
Кажется, что в таком языке стилей, как XSLT, реализовать подобное невозможно. Тем не менее, это можно сделать, по крайней мере, в XSLT 1.0. Основная идея состоит в том, что значение, возвращаемое шаблоном, можно сохранять в переменной, если шаблон вызывается внутри элемента <xsl:variable>, в котором объявляется эта переменная. Пусть, например, у нас есть именованный шаблон factorial, и мы хотим вычислить 6!. Тогда шаблону можно передать значение 6 при помощи элемента <xsl:with-param> и присвоить строковое значение результата переменной result, которое я затем показываю:
<?xml version="1.0"?>
<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="factorial">
<xsl:with-param name="value" select="6"/>
</xsl:call-template>
</xsl:variable>
6! = <xsl:value-of select="$result"/>
</xsl:template>
.
.
.
Следующий пример демонстрирует, как можно реализовать шаблон factorial, чтобы для вычисления факториала он вызывал сам себя. На языке программирования я мог бы написать рекурсивный вызов как n!=n*factorial(n-1), но у нас нет оператора присваивания; поэтому, когда я вычисляю factorial(n-1), я сохраняю это значение в новой переменной temp и на каждом шаге возвращаю значение n*$temp:
<?xml version="1.0"?>
<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="factorial">
<xsl:with-param name="value" select="6"/>
</xsl:call-template>
</xsl:variable>
6! = <xsl:value-of select="$result"/>
</xsl:template>
<xsl:template name="factorial">
<xsl:param name="value"/>
<xsl:choose>
<xsl:when test="$value=1">
<xsl:value-of select="1"/>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="temp">
<xsl:call-template name="factorial">
<xsl:with-param name="value" select="$value - 1"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$temp * $value"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Вот результирующий документ:
<?xml version="1.0" encoding="utf-8"?>
6! = 720
Как видите, это можно сделать, по крайней мере, в XSLT 1.0, в котором разрешены использованные здесь фрагменты результирующего дерева.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Тела шаблонов
Тела шаблонов Шаблоны формируются по жестко заданным правилам. Они способны содержать элементы <xsl:param>, за которыми следует тело шаблона; в последнем могут содержаться данные PCDATA, инструкции XSLT, элементы расширения и элементы буквального
Создание шаблонов
Создание шаблонов При работе с корреспонденцией может возникнуть ситуация, когда в своих сообщениях вам придется неоднократно набирать повторяющийся текстовый фрагмент (простейший пример – приветствие и подпись). Согласитесь, в этом случае имеет смысл зафиксировать
Удаление шаблонов узлов STP
Удаление шаблонов узлов STP Если нужно удалить файлы STP из галереи шаблонов узлов, выполните следующее.Откройте узел SharePoint верхнего уровня, на который были загружены файлы STP. Если потребуется, введите имя пользователя и пароль и щелкнитеУбедитесь, что имеете достаточно
Применение шаблонов языка C++.
Применение шаблонов языка C++. Альтернативой приведенной выше реализации может служить реализация класса Singleton при помощи шаблонов языка С++. Преимущество такого подхода заключается в автоматической параметризации метода Instance(), что приводит к отсутствию необходимости
2.11. Использование шаблонов Word
2.11. Использование шаблонов Word Еще один инструмент упрощения ввода текста – шаблон – документ, который создают один раз, чтобы потом использовать его для создания других документов. Шаблоны представляют собой электронные бланки, в которых можно задать все необходимые
Использование шаблонов титров
Использование шаблонов титров Титры могут использоваться не только для показа на экране названия фильма и списка актеров. В немом кино с помощью титров выводились диалоги, в современных фильмах – место или время события в кадре, в информационных передачах – номера
Создание библиотек шаблонов
Создание библиотек шаблонов Приложение для создания библиотек шаблонов (по своей сути также прикладная библиотека к КОМПАС-3D, названная Менеджером шаблонов) позволяет создавать особый вид пользовательских прикладных библиотек. Эти библиотеки состоят из базового
Создание шаблонов
Создание шаблонов Если вам приходится много переписываться, очень скоро вы обнаружите, что вам надоело каждый раз писать «Доброе время суток!» в начале письма и «С искренними надеждами на плодотворное сотрудничество, Вассисуалий Апполинарович Иммануилов-Полесский» в
Создание пользовательских шаблонов
Создание пользовательских шаблонов Благодаря шаблонам можно сэкономить много времени. Например, если вы постоянно работаете с какой-нибудь организацией и каждый раз вводите стандартное приветствие, реквизиты и т. д., удобно будет создать собственный шаблон на основе
Использование шаблонов Word
Использование шаблонов Word Еще один инструмент упрощения ввода текста – шаблоны. Шаблон – это документ, который создают один раз и потом используют для создания других документов. Шаблоны представляют собой электронные бланки, в которых можно настроить все необходимые
Создание шаблонов Joomla!
Создание шаблонов Joomla! Для того, чтобы изменить внешний вид сайта и привести его в соответствие и привести его в соответствие с вашими требованиями, необходимо создать новый шаблон или изменить уже имеющийся. В этой статье вы узнаете об основах создания шаблонов в
Создание собственных шаблонов
Создание собственных шаблонов Теперь сфокусируемся на том, как создать собственный шаблон. Перед началом работы над шаблоном необходимо обдумать некоторые ключевые моменты. Рассмотрим их по