Выбрать главу

  <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.