<H1>
The Colorful Planets Table
</H1>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<TR>
<TD><FONT COLOR="RED">Mercury</FONT></TD>
<TD><FONT COLOR="RED">.0553 (Earth = 1)</FONT></TD>
<TD><FONT COLOR="RED">1516 miles</FONT></TD>
<TD><FONT COLOR="RED">58.65 days</FONT></TD>
</TR>
<TR>
<TD><FONT COLOR="GREEN">Venus</FONT></TD>
<TD><FONT COLOR="GREEN">.815 (Earth = 1)</FONT></TD>
<TD><FONT COLOR="GREEN">3716 miles</FONT></TD>
<TD><FONT COLOR="GREEN">116.75 days</FONT></TD>
</TR>
<TR>
<TD><FONT COLOR="BLUE">Earth</FONT></TD>
<TD><FONT COLOR="BLUE">1 (Earth = 1)</FONT></TD>
<TD><FONT COLOR="BLUE">2107 miles</FONT></TD>
<TD><FONT COLOR="BLUE">1 days</FONT></TD>
</TR>
</TABLE>
</BODY>
</HTML>
Этот результирующий документ показан на рис. 9.2 (пусть даже в черно-белом исполнении).
Рис. 9.2. Вызов именованного шаблона с параметрами
В следующем примере я использую параметры для локализации используемого в шаблоне языка. Я создаю новый шаблон localize с параметром language. Если language установлен в «en», означая английский, результирующий документ будет озаглавлен «Planets»; если language установлен в «de», немецкий, результирующий документ будет озаглавлен «Planeten», а если в «fr», французский, результирующий документ будет озаглавлен «Planetes».
Здесь я вызываю шаблон localize, установив language в «fr»:
<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
<xsclass="underline" call-template name="localize">
<xsclass="underline" with-param name="language" select="'fr'"/>
</xsclass="underline" call-template>
</TITLE>
</HEAD>
<BODY>
<H1>
<xsclass="underline" call-template name="localize">
<xsclass="underline" with-param name="language" select="'fr'"/>
</xsclass="underline" call-template>
.
.
.
А вот как выглядит параметризованный шаблон «COLORS». Заметьте, что я объявляю параметр COLOR в шаблоне при помощи элемента <xsclass="underline" param> (и заметьте, что в HTML 4.01 символьный элемент для «е» в «Planetes», который я и использую — это è):
<?xml version="1.0"?>
<xsclass="underline" stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="/PLANETS">
<HTML>
<HEAD>
<TITLE>
<xsclass="underline" call-template name="localize">
<xsclass="underline" with-param name="language" select="'fr'"/>
</xsclass="underline" call-template>
</TITLE>
</HEAD>
<BODY>
<H1>
<xsclass="underline" call-template name="localize">
<xsclass="underline" with-param name="language" select="'fr'"/>
</xsclass="underline" call-template>
</H1>
<TABLE BORDER="2">
<TR>
<TD>Name</TD>
<TD>Mass</TD>
<TD>Radius</TD>
<TD>Day</TD>
</TR>
<xsclass="underline" apply-templates/>
</TABLE>
</BODY>
</HTML>
</xsclass="underline" template>
<xsclass="underline" template name="localize">
<xsclass="underline" param name="language"/>
<xsclass="underline" if test="$language='en'">
<xsclass="underline" text>Planets</xsclass="underline" text>
</xsclass="underline" if>
<xsclass="underline" if test="$language='de'">
<xsclass="underline" text>Planeten</xsclass="underline" text>
</xsclass="underline" if>
<xsclass="underline" if test="$language='fr'">
<xsclass="underline" text>Planètes</xsclass="underline" text>
</xsclass="underline" if>
</xsclass="underline" template>
.
.
.
Вот результирующий локализованный документ:
<HTML>
<HEAD>
<TITLE>Planètes</TITLE>
</HEAD>
<BODY>
<H1>Planè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.