=> Главная База Знаний Xslt Элементы <xsl:param> и <xsl:with-param>: создание параметров


Элементы <xsl:param> и <xsl:with-param>: создание параметров

Элементы <xsl:param> и <xsl:with-param>: создание параметров

Параметры во многом похожи на переменные — за тем исключением, что они обычно используются вместе с именованными шаблонами. Параметры позволяют вам передать в шаблон какие-то значения. Параметры создаются элементом

<xsl:param>
, обладающим двумя атрибутами:

• 

name
(обязательный). Имя переменной, устанавливается в QName;

• 

select
(необязательный). Значение параметра по умолчанию. Устанавливается в выражение XPath.

Аналогично

<xsl:variable>
, этот элемент может либо быть элементом высокого уровня, либо применяться внутри тела шаблона. Параметры, созданные элементами
<xsl:param>
, являются глобальными, а созданные внутри шаблонов — локальными. При создании параметра внутри тела шаблона, элемент
<xsl:param>
должен быть расположен перед какими-либо другими дочерними элементами. Элемент может также содержать необязательное тело шаблона, создающее фрагмент результирующего дерева — в XSLT 1.1 это уже не разрешено. Если элемент содержит тело, атрибут
select
использовать нельзя.

После объявления параметра при помощи

<xsl:param>
к его значению можно обращаться в шаблоне таким же способом, как и к значению переменной, — добавляя к имени префикс «$».

Когда вы вызываете именованный шаблон при помощи

<xsl:call-template>
или применяете шаблоны с использованием
<xsl:apply-templates>
, вы можете задать значение используемых в шаблоне параметров с помощью элемента
<xsl:with-param>
. Если самому параметру при объявлении было присвоено значение атрибутом
select
элемента
<xsl:param>
, это значение выступает в качестве значения параметра по умолчанию. Значение по умолчанию будет перекрыто, если вы зададите новое значение параметра при помощи элемента
<xsl:with-param>
. У элемента
<xsl:with-param>
два атрибута:

• 

name
(обязательный). Имя переменной; устанавливается в QName;

• 

select
(необязательный). Выражение XPath, задающее значение параметра. Если опустить этот атрибут, значение переменной будет определяться содержимым
<xsl:with-param>
.

Элемент может также содержать необязательное тело шаблона, создающее фрагмент результирующего дерева, но в XSLT 1.1 это уже не разрешено.

В следующем примере (листинг 9.3) я создаю именованный шаблон с именем «COLORS» (цвета), добавляющий цвет в данные планет в результирующем HTML-документе. Этот именованный шаблон использует единственный параметр,

COLOR
, который устанавливается в требуемый цвет. В примере я устанавливаю параметр
COLOR
в разные цвета для разных планет, используя
<xsl:with-param>
и вызывая шаблон «COLORS». Вот как это реализуется на практике.

Листинг 9.3. Применение параметров таблиц стилей

<xsl:stylesheet version="1.1"

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

 <xsl:template match="/PLANETS">

  <HTML>

  .

  .

  .

  </HTML>

 </xsl:template>


 <xsl:template match="PLANET">

  <xsl:if test="NAME='Mercury'">

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

    <xsl:with-param name="COLOR" select="'RED'"/>

   </xsl:call-template>

  </xsl:if>

  <xsl:if test="NAME='Venus'">

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

    <xsl:with-param name="COLOR" select="'GREEN'"/>

   </xsl:call-template>

  </xsl:if>

  <xsl:if test="NAME='Earth'">

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

    <xsl:with-param name="COLOR" select="'BLUE'"/>

   </xsl:call-template>

  </xsl:if>

 </xsl:template>

 .

 .

 .

Данная таблица вызывает шаблон «COLORS» с разными значениями параметра COLOR. Я могу воспользоваться этими цветами при форматировании данных планет. Заметьте, что я объявил параметр COLOR при помощи

<xsl:param>
в самом начале шаблона «COLORS»:

<xsl:stylesheet version="1.1"

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

 <xsl:template match="/PLANETS">

  <HTML>

   .

   .

   .

  </HTML>

 </xsl:template>


 <xsl:template match="PLANET">

  <xsl:if test="NAME='Mercury'">

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

    <xsl:with-param name="COLOR" select="'RED'"/>

   </xsl:call-template>

  </xsl:if>

  <xsl:if test="NAME='Venus'">

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

    <xsl:with-param name="COLOR" select="'GREEN'"/>

   </xsl:call-template>

  </xsl:if>

  <xsl:if test="NAME='Earth'">

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

    <xsl:with-param name="COLOR" select="'BLUE'"/>

   </xsl:call-template>

  </xsl:if>

 </xsl:template>


 <xsl:template name="COLORS"> <xsl:param name="COLOR"/>

  <TR>

   <TD>

    <FONT COLOR="{$COLOR}"><xsl:value-of select="NAME"/></FONT>

   </TD>

   <TD>

    <FONT COLOR="{$COLOR}"><xsl:apply-templates select="MASS"/></FONT>

   </TD>

   <TD>

    <FONT COLOR="{$COLOR}"><xsl:apply-templates select="RADIUS"/></FONT>

   </TD>

   <TD>

    <FONT COLOR="{$COLOR}"><xsl:apply-templates select="DAY"/></FONT>

   </TD>

  </TR>

 </xsl:template>


 <xsl:template match="MASS">

  <xsl:value-of select="."/>

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

 .

 .

 .

 <xsl:template match="DAY">

  <xsl:value-of select="."/>

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

</xsl:stylesheet>

И вот результат:

<HTML>

 <HEAD>

  <TITLE>

   The Colorful Planets Table

  </TITLE>

 </HEAD>

 <BODY>

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

Этот результирующий документ показан на 2 (пусть даже в черно-белом исполнении).

Элементы <xsl:param> и <xsl:with-param>: создание параметров

2. Вызов именованного шаблона с параметрами


В следующем примере я использую параметры для локализации используемого в шаблоне языка. Я создаю новый шаблон

localize
с параметром
language
. Если language установлен в «
en
», означая английский, результирующий документ будет озаглавлен «Planets»; если
language
установлен в «
de
», немецкий, результирующий документ будет озаглавлен «Planeten», а если в «
fr
», французский, результирующий документ будет озаглавлен «Planetes».

Здесь я вызываю шаблон

localize
, установив
language
в «fr»:

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

     .

     .

     .

А вот как выглядит параметризованный шаблон «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è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>

   .

   .

   .

Этот документ показан на 3.

Элементы <xsl:param> и <xsl:with-param>: создание параметров

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


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