Область видимости параметров определяется в точности так же, как область видимости переменных. Единственным, на что следует обратить здесь внимание — это то, что элементы
xsl:param
, определяемые в шаблонах, должны всегда быть его первыми дочерними элементами. Поэтому область видимости локальных параметров определяется несколько легче, чем область видимости локальных переменных: после определения параметр может использоваться в том шаблоне где угодно.
Прямым следствием из этого является то, что один шаблон не может иметь двух параметров с одинаковыми именами, поскольку их области видимости будут обязательно пересекаться, ведь один
из параметров в любом случае будет следовать за другим.
Элемент xsl:with-param
Синтаксис этого элемента выглядит следующим образом:
<xsl:with-param
name="имя"
select="выражение">
<!-- Содержимое: шаблон -->
</xsl:with-param>
Как можно заметить, элемент
xsl:with-param
абсолютно идентичен элементу
xsl:param
(отличаются только их имена). Практически настолько же похоже и их действие: элемент
xsl:with-param
тоже связывает с именем параметра значение, и при выполнении шаблона это значение будет использоваться вместо значения параметра по умолчанию.
Таким образом, значение параметра, заданного в шаблоне, выбирается в соответствии со следующими положениями:
□ если в элементе, который вызывает этот шаблон, присутствует элемент
xsl:with-param
, передающий значение этого параметра, в шаблоне будет использоваться переданное значение;
□ если в элементе, который вызывает этот шаблон, элемента
xsl:with-param
, с соответствующим именем нет, в качестве значения параметра будет использоваться значение по умолчанию.
Элемент
xsl:with-param
может использоваться только в качестве дочернего элемента
xsl:apply-templates
и
xsl:call-template
.
В качестве простого примера приведем шаблон, который выводит сокращение названия для недели по его номеру. Номер дня передается в шаблон параметром с именем
day-number
.
Листинг 5.26. Вывод названия дня недели по номеру
<xsl:template name="day-name">
<xsl:param name="day-number" select="0"/>
<xsl:choose>
<xsl:when test="$day-number=1">Mon</xsl:when>
<xsl:when test="$day-number=2">Tue</xsl:when>
<xsl:when test="$day-number=3">Wed</xsl:when>
<xsl:when test="$day-number=4">Thu</xsl:when>
<xsl:when test="$day-number=5">Fri</xsl:when>
<xsl:when test="$day-number=6">Sat</xsl:when>
<xsl:when test="$day-number=7">Sun</xsl:when>
<xsl:otherwise>Hmm...</xsl:otherwise>
</xsl:choose>
</xsl:template>
Результатом вызова:
<xsl:call-template name="day-name">
<xsl:with-param name="day-number" select="1"/>
</xsl:call-template>
будет
текстовый узел "
Mon
". Рассмотрим теперь случай, когда параметра передано не было:
<xsl:call-template name="day-name"/>
Шаблон выведет задумчивое
Hmm...
, поскольку значение параметра
day-number
будет по умолчанию нулем (атрибут
select
имеет вид
select="0"
) и в операторе выбора
xsl:choose
сработает условие
xsl:otherwise
.
Параметры могут быть использованы как в именованных, так и в неименованных шаблонах. Именованные шаблоны с параметрами ведут себя как самые настоящие функции — они могут вызываться с определенными параметрами вне зависимости от контекста, только чтобы выполнить какие-либо действия с переданными значениями. В случае обычных, неименованных шаблонов параметры могут предоставлять некую дополнительную информацию.
Пример
Представим себе описание меню в следующем формате:
<menu>
<menuitem index="1" name="Home" href="#"/>
<menuitem index="2" name="News" href="#"/>
<menuitem index="3" name="Profile" href="#"/>
<menuitem index="4" name="Contact" href="#"/>
</menu>
Для того чтобы при обработке особым образом выделять текущую страницу, определим в шаблоне параметр
current
и будем выводить название страницы в элементе
b
(от англ. bold — полужирный), если значение
current
равно индексу данного пункта меню; если текущая страница и индекс пункта меню не совпадают, то выводиться будет ссылка.