Чтение онлайн

на главную - закладки

Жанры

Технология XSLT

Валиков Алексей Н.

Шрифт:

Вызов именованного шаблона выполняется элементом

xsl:call-template
, в атрибуте
name
которого указывается имя вызываемого шаблона. Такой вызов не зависит от того, какая часть документа обрабатывается в данный момент и может производиться по необходимости.

Параметры именованному шаблону передаются точно так же, как и обычному — при помощи элементов

xsl:with-param
, которые могут быть включены в вызывающий элемент
xsl:call-template
. Примером вызова именованного шаблона с параметрами может быть конструкция
вида

<xsl:call-template name="foo">

 <xsl:with-param name="x" select="1"/>

 <xsl:with-param name="y" select="2"/>

</xsl:call-template>

которая вызывает шаблон с именем

foo
и передает ему параметр
x
со значением, равным
1
и параметр
y
со значением, равным
2
.

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

Пример

В качестве примера приведем простой шаблон, который вычисляет квадрат переданного ему параметра

x
:

<xsl:template name="sqr">

 <xsl:param name="x"/>

 <xsl:value-of select="$x * $x"/>

</xsl:template>

Для того чтобы присвоить переменной

у
квадрат числа
6
мы можем записать следующее:

<xsl:variable name="y">

 <xsl:call-template name="sqr">

<xsl:with-param name="x" select="6"/>

 </xsl:call-template>

</xsl:variable>

Обратим внимание, что значение переменной

y
будет иметь вовсе не численный тип. Несмотря на то, что элемент

<xsl:value-of select="$y"/>

выведет строку "

36
", переменная у содержит не число, а дерево, и
36
лишь является результатом конвертации в строку при выполнении
xsl:value-of
.

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

Пример

После выполнения действий

<xsl:variable name="result">

 <xsl:call-template name="sqr">

<xsl:with-param name="x" select="6"/>

 </xsl:call-template>

</xsl:variable>

<xsl:variable name="sqr-string" select="string($result)"/>

<xsl:variable name="sqr-number" select="number($result)"/>

переменные

sqr-string
и
sqr-number
будут содержать строковое и численное значение результата вычисления соответственно.

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

Пример

В следующем преобразовании шаблон с именем

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')"/>

Поделиться:
Популярные книги

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Безумный Макс. Ротмистр Империи

Ланцов Михаил Алексеевич
2. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
4.67
рейтинг книги
Безумный Макс. Ротмистр Империи

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

Идеальный мир для Лекаря

Сапфир Олег
1. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря

Золушка по имени Грейс

Ром Полина
Фантастика:
фэнтези
8.63
рейтинг книги
Золушка по имени Грейс

Измена. Мой заклятый дракон

Марлин Юлия
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Измена. Мой заклятый дракон

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Страж Кодекса. Книга VI

Романов Илья Николаевич
6. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга VI

Поющие в терновнике

Маккалоу Колин
Любовные романы:
современные любовные романы
9.56
рейтинг книги
Поющие в терновнике

Темный Лекарь 6

Токсик Саша
6. Темный Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Темный Лекарь 6

Возвышение Меркурия. Книга 15

Кронос Александр
15. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 15

Надуй щеки! Том 4

Вишневский Сергей Викторович
4. Чеболь за партой
Фантастика:
попаданцы
уся
дорама
5.00
рейтинг книги
Надуй щеки! Том 4

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Сыночек в награду. Подари мне любовь

Лесневская Вероника
1. Суровые отцы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сыночек в награду. Подари мне любовь