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

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

Жанры

Холзнер Стивен

Шрифт:

.

.

.

А вот как выглядит параметризованный шаблон «COLORS». Заметьте, что я объявляю параметр

COLOR
в шаблоне при помощи элемента
<xsl:param>
(и заметьте, что в HTML 4.01 символьный элемент для «е» в «Planetes», который я и использую — это
&#232;
):

<?xml version="1.0"?>

<xsl:stylesheet version="1.1"

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

 <xsl:template match="/PLANETS">

<HTML>

<HEAD>

<TITLE>

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

<xsl:with-param name="language" select="'fr'"/>

</xsl:call-template>

</TITLE>

</HEAD>

<BODY>

<H1>

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

<xsl:with-param name="language" select="'fr'"/>

</xsl:call-template>

</H1>

<TABLE BORDER="2">

<TR>

<TD>Name</TD>

<TD>Mass</TD>

<TD>Radius</TD>

<TD>Day</TD>

</TR>

<xsl:apply-templates/>

</TABLE>

</BODY>

</HTML>

 </xsl:template>

 <xsl:template name="localize">

<xsl:param name="language"/>

<xsl:if test="$language='en'">

<xsl:text>Planets</xsl:text>

</xsl:if>

<xsl:if test="$language='de'">

<xsl:text>Planeten</xsl:text>

</xsl:if>

<xsl:if test="$language='fr'">

<xsl:text>Plan&#232;tes</xsl:text>

</xsl:if>

 </xsl:template>

 .

 .

 .

Вот результирующий локализованный документ:

<HTML>

 <HEAD>

<TITLE>Plan&egrave;tes</TITLE>

 </HEAD>

 <BODY>

<H1>Plan&egrave;tes</H1>

<TABLE BORDER="2">

<TR>

<TD>Name</TD>

<TD>Mass</TD>

<TD>Radius</TD>

<TD>Day</TD>

</TR>

.

.

.

Этот документ показан на рис. 9.3.

Рис. 9.3. Вызов именованного шаблона с параметрами для установки языков

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

Рекурсивный вызов шаблонов

Эта тема предназначена, главным образом, для программистов, поскольку здесь я буду пользоваться 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
, которое я затем показываю:

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

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.50
рейтинг книги
Наследие Маозари 6

Первый среди равных. Книга X

Бор Жорж
10. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Первый среди равных. Книга X

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Вернувшийся: Новая жизнь. Том I

Vector
1. Вернувшийся
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Новая жизнь. Том I

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Евангелие от зверя

Головачев Василий Васильевич
Шедевры отечественной фантастики
Фантастика:
фэнтези
альтернативная история
4.57
рейтинг книги
Евангелие от зверя

Третий. Том 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
попаданцы
5.00
рейтинг книги
Третий. Том 6

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон