использовать в выражениях, добавляя перед именем параметра префикс '$'. К примеру, значение нашего параметра x может быть получено конструкцией вида $x.

Для того чтобы передать в шаблон определенные значения параметров, элементы, которые вызывают этот шаблон, должны содержать один или несколько элементов xsl:with-param, который мы рассмотрим чуть ниже. Глобальные параметры, объявленные элементами xsl:param верхнего уровня, также могут быть переданы преобразованию, однако конкретный механизм реализации этой передачи целиком и полностью зависит от реализации конкретного процессора.

Область видимости параметров

Область видимости параметров определяется в точности так же, как область видимости переменных. Единственным, на что следует обратить здесь внимание — это то, что элементы 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='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 равно индексу данного пункта меню; если текущая страница и индекс пункта меню не совпадают, то выводиться будет ссылка.

<xsl:template match='menuitem'>

 <xsl:param name='current' select='1'/>

 <xsl:choose>

  <xsl:when test='$current=@index'>

   <b>

    <xsl:value-of select='@name'/>

   </b>

  </xsl:when>

  <xsl:otherwise>

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату