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

 <!-- Содержимое: шаблон -->

</xsclass="underline" with-param>

Как можно заметить, элемент xsclass="underline" with-param абсолютно идентичен элементу xsclass="underline" param (отличаются только их имена). Практически настолько же похоже и их действие: элемент xsclass="underline" with-param тоже связывает с именем параметра значение, и при выполнении шаблона это значение будет использоваться вместо значения параметра по умолчанию.

Таким образом, значение параметра, заданного в шаблоне, выбирается в соответствии со следующими положениями:

□ если в элементе, который вызывает этот шаблон, присутствует элемент xsclass="underline" with-param, передающий значение этого параметра, в шаблоне будет использоваться переданное значение;

□ если в элементе, который вызывает этот шаблон, элемента xsclass="underline" with-param, с соответствующим именем нет, в качестве значения параметра будет использоваться значение по умолчанию.

Элемент xsclass="underline" with-param может использоваться только в качестве дочернего элемента xsclass="underline" apply-templates и xsclass="underline" call-template.

В качестве простого примера приведем шаблон, который выводит сокращение названия для недели по его номеру. Номер дня передается в шаблон параметром с именем day-number.

Листинг 5.26. Вывод названия дня недели по номеру

<xsclass="underline" template name="day-name">

 <xsclass="underline" param name="day-number" select="0"/>

 <xsclass="underline" choose>

  <xsclass="underline" when test="$day-number=1">Mon</xsclass="underline" when>

  <xsclass="underline" when test="$day-number=2">Tue</xsclass="underline" when>

  <xsclass="underline" when test="$day-number=3">Wed</xsclass="underline" when>

  <xsclass="underline" when test="$day-number=4">Thu</xsclass="underline" when>

  <xsclass="underline" when test="$day-number=5">Fri</xsclass="underline" when>

  <xsclass="underline" when test="$day-number=6">Sat</xsclass="underline" when>

  <xsclass="underline" when test="$day-number=7">Sun</xsclass="underline" when>

  <xsclass="underline" otherwise>Hmm...</xsclass="underline" otherwise>

 </xsclass="underline" choose>

</xsclass="underline" template>

Результатом вызова:

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

 <xsclass="underline" with-param name="day-number" select="1"/>

</xsclass="underline" call-template>

будет текстовый узел "Mon". Рассмотрим теперь случай, когда параметра передано не было:

<xsclass="underline" call-template name="day-name"/>

Шаблон выведет задумчивое Hmm..., поскольку значение параметра day-number будет по умолчанию нулем (атрибут select имеет вид select="0") и в операторе выбора xsclass="underline" choose сработает условие xsclass="underline" otherwise.

Параметры могут быть использованы как в именованных, так и в неименованных шаблонах. Именованные шаблоны с параметрами ведут себя как самые настоящие функции — они могут вызываться с определенными параметрами вне зависимости от контекста, только чтобы выполнить какие-либо действия с переданными значениями. В случае обычных, неименованных шаблонов параметры могут предоставлять некую дополнительную информацию.

Пример

Представим себе описание меню в следующем формате:

<menu>

 <menuitem index="1" name="Home" href="home.htm"/>

 <menuitem index="2" name="News" href="news.htm"/>

 <menuitem index="3" name="Profile" href="profile.htm"/>

 <menuitem index="4" name="Contact" href="contact.htm"/>

</menu>

Для того чтобы при обработке особым образом выделять текущую страницу, определим в шаблоне параметр current и будем выводить название страницы в элементе b (от англ. bold — полужирный), если значение current равно индексу данного пункта меню; если текущая страница и индекс пункта меню не совпадают, то выводиться будет ссылка.

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

 <xsclass="underline" param name="current" select="1"/>

 <xsclass="underline" choose>

  <xsclass="underline" when test="$current=@index">

   <b>

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

   </b>

  </xsclass="underline" when>

  <xsclass="underline" otherwise>

   <a href="{@href}">

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

   </a>

  </xsclass="underline" otherwise>

 </xsclass="underline" choose>

</xsclass="underline" template>

Результатом выполнения шаблона

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

 <xsclass="underline" apply-templates select="menuitem">

  <xsclass="underline" with-param name="current" select="3"/>

 </xsclass="underline" apply-templates>

</xsclass="underline" template>

будет фрагмент меню вида

<a href="home.htm">Home</a>

<a href="news.htm">News</a>

<b>Profile</b>

<a href="contact.htm">Contact</a>

Попробуем теперь обработать элементы menuitem, не указывая значение параметра current:

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

 <xsclass="underline" apply-templates select="menuitem"/>

</xsclass="underline" template>

Результат будет получен в виде:

<b>Home</b>

<а href="news.htm">News</a>

<а href="profile.htm">Profile</a>

<a href="contact.htm">Contact</a>

Этот фрагмент выходящего документа легко объяснить. Вследствие определения:

<xsclass="underline" param name="current" select="1"/>

значением параметра current по умолчанию является 1, и поэтому в меню был выбран пункт с индексом 1.

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

Итак, предположим, что мы генерируем выходящий документ следующим именованным шаблоном:

<xsclass="underline" template name="html">

 <xsclass="underline" param name="head">

  <head>

   <title>Title one</title>

  </head>

 </xsclass="underline" param>

 <html>

  <xsclass="underline" copy-of select="$head"/>

   <body>

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

   </body>

  </html>

 </xsclass="underline" template>

Параметр head по умолчанию будет содержать дерево, состоящее из элемента head и его дочернего элемента title, который содержит текст "Title one". Результат выполнения вызова

<xsclass="underline" call-template name="html"/>

мы можем видеть на следующем листинге:

<html>

 <head>

  <title>Title one</title>

 </head>

 <body>content</body>

</html>