<!-- Содержимое: шаблон -->
</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.
<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>