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

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

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

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

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

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

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

В следующем примере (листинг 9.3) я создаю именованный шаблон с именем «COLORS» (цвета), добавляющий цвет в данные планет в результирующем HTML-документе. Этот именованный шаблон использует единственный параметр, COLOR, который устанавливается в требуемый цвет. В примере я устанавливаю параметр COLOR в разные цвета для разных планет, используя <xsclass="underline" with-param> и вызывая шаблон «COLORS». Вот как это реализуется на практике.

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

<xsclass="underline" stylesheet version="1.1"

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

 <xsclass="underline" template match="/PLANETS">

  <HTML>

  .

  .

  .

  </HTML>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET">

  <xsclass="underline" if test="NAME='Mercury'">

   <xsclass="underline" call-template name="COLORS">

    <xsclass="underline" with-param name="COLOR" select="'RED'"/>

   </xsclass="underline" call-template>

  </xsclass="underline" if>

  <xsclass="underline" if test="NAME='Venus'">

   <xsclass="underline" call-template name="COLORS">

    <xsclass="underline" with-param name="COLOR" select="'GREEN'"/>

   </xsclass="underline" call-template>

  </xsclass="underline" if>

  <xsclass="underline" if test="NAME='Earth'">

   <xsclass="underline" call-template name="COLORS">

    <xsclass="underline" with-param name="COLOR" select="'BLUE'"/>

   </xsclass="underline" call-template>

  </xsclass="underline" if>

 </xsclass="underline" template>

 .

 .

 .

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

<xsclass="underline" stylesheet version="1.1"

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

 <xsclass="underline" template match="/PLANETS">

  <HTML>

   .

   .

   .

  </HTML>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET">

  <xsclass="underline" if test="NAME='Mercury'">

   <xsclass="underline" call-template name="COLORS">

    <xsclass="underline" with-param name="COLOR" select="'RED'"/>

   </xsclass="underline" call-template>

  </xsclass="underline" if>

  <xsclass="underline" if test="NAME='Venus'">

   <xsclass="underline" call-template name="COLORS">

    <xsclass="underline" with-param name="COLOR" select="'GREEN'"/>

   </xsclass="underline" call-template>

  </xsclass="underline" if>

  <xsclass="underline" if test="NAME='Earth'">

   <xsclass="underline" call-template name="COLORS">

    <xsclass="underline" with-param name="COLOR" select="'BLUE'"/>

   </xsclass="underline" call-template>

  </xsclass="underline" if>

 </xsclass="underline" template>

 <xsclass="underline" template name="COLORS"> <xsclass="underline" param name="COLOR"/>

  <TR>

   <TD>

    <FONT COLOR="{$COLOR}"><xsclass="underline" value-of select="NAME"/></FONT>

   </TD>

   <TD>

    <FONT COLOR="{$COLOR}"><xsclass="underline" apply-templates select="MASS"/></FONT>

   </TD>

   <TD>

    <FONT COLOR="{$COLOR}"><xsclass="underline" apply-templates select="RADIUS"/></FONT>

   </TD>

   <TD>

    <FONT COLOR="{$COLOR}"><xsclass="underline" apply-templates select="DAY"/></FONT>

   </TD>

  </TR>

 </xsclass="underline" template>

 <xsclass="underline" template match="MASS">

  <xsclass="underline" value-of select="."/>

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

 .

 .

 .

 <xsclass="underline" template match="DAY">

  <xsclass="underline" value-of select="."/>

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

<HTML>

 <HEAD>

  <TITLE>

   The Colorful Planets Table

  </TITLE>

 </HEAD>

 <BODY>