Именованный шаблон как функция
Сложно переоценить возможности механизмов расширений языка XSLT. Они позволяют сочетать простоту и гибкость обработки XML-документов при помощи элементов XSLT и выражений XPath. Практически любая функция, которая отсутствует в XSLT, может быть написана на подходящем языке программирования и подключена к процессору.
Но как уже отмечалось ранее, функции расширения ограничивают переносимость преобразований. Во-первых, функции расширения одного процессора совсем необязательно будут присутствовать в другом процессоре — скорее наоборот. Во-вторых, не приходится надеяться, что пользовательские модули, написанные на одном языке или с использованием одного интерфейса, смогут использоваться любым процессором. Поэтому часто перед разработчиком стоит проблема решить определенную задачу, используя только стандартные функции и элементы XSLT.
В этом разделе мы рассмотрим возможность использования именованных шаблонов в качестве функций, которые принимают на вход несколько параметров и возвращают некоторое вычисленное значение.
Использование именованных шаблонов как функций обуславливается следующими тезисами.
Именованный шаблон можно вызывать вне зависимости от того, какая часть документа обрабатывается в данный момент.
Именованному шаблону можно передавать параметры.
Результат выполнения именованного шаблона можно присваивать переменной.
Вызов именованного шаблона выполняется элементом xsl:call-template
, в атрибуте name
которого указывается имя вызываемого шаблона. Такой вызов не зависит от того, какая часть документа обрабатывается в данный момент и может производиться по необходимости.
Параметры именованному шаблону передаются точно так же, как и обычному — при помощи элементов xsl:with-param
, которые могут быть включены в вызывающий элемент xsl:call-template
. Примером вызова именованного шаблона с параметрами может быть конструкция вида
которая вызывает шаблон с именем foo
и передает ему параметр x
со значением, равным 1
и параметр y
со значением, равным 2
.
Вызов именованного шаблона может также производиться при инициализации переменной — внутри элемента xsl:variable. В этом случае с переменной связывается результирующий фрагмент дерева, возвращаемый именованным шаблоном.