Синтаксис этого элемента выглядит следующим образом:
name=" имя "
select=" выражение ">
Как можно заметить, элемент 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. Вывод названия дня недели по номеру
Mon
Tue
Wed
Thu
Fri
Sat
Sun
Hmm...
Результатом вызова:
будет текстовый узел " Mon". Рассмотрим теперь случай, когда параметра передано не было:
Шаблон выведет задумчивое Hmm..., поскольку значение параметра day-numberбудет по умолчанию нулем (атрибут selectимеет вид select="0") и в операторе выбора xsl:chooseсработает условие xsl:otherwise.
Параметры могут быть использованы как в именованных, так и в неименованных шаблонах. Именованные шаблоны с параметрами ведут себя как самые настоящие функции — они могут вызываться с определенными параметрами вне зависимости от контекста, только чтобы выполнить какие-либо действия с переданными значениями. В случае обычных, неименованных шаблонов параметры могут предоставлять некую дополнительную информацию.
Пример
Представим себе описание меню в следующем формате:
Для того чтобы при обработке особым образом выделять текущую страницу, определим в шаблоне параметр currentи будем выводить название страницы в элементе b(от англ. bold — полужирный), если значение currentравно индексу данного пункта меню; если текущая страница и индекс пункта меню не совпадают, то выводиться будет ссылка.
Результатом выполнения шаблона
будет фрагмент меню вида
Home
News
Profile
Contact
Попробуем теперь обработать элементы menuitem, не указывая значение параметра current:
Результат будет получен в виде:
Home
<���а href="news.htm">News
<���а href="profile.htm">Profile
Contact
Этот фрагмент выходящего документа легко объяснить. Вследствие определения:
значением параметра currentпо умолчанию является 1, и поэтому в меню был выбран пункт с индексом 1.
Мы упомянули, что значением параметра может быть дерево. Попробуем пояснить эту концепцию на примере генерации HTML-документа.
Итак, предположим, что мы генерируем выходящий документ следующим именованным шаблоном:
content
Параметр headпо умолчанию будет содержать дерево, состоящее из элемента headи его дочернего элемента title, который содержит текст " Title one". Результат выполнения вызова
мы можем видеть на следующем листинге:
content
Выделенный фрагмент относится к части дерева, которая была создана копированием значения параметра head.
Попробуем теперь передать в качестве параметра дерево, сгенерированное следующим шаблоном:
H1 {border-width: 1; border: solid; text-align: center}
Для того чтобы передать результат выполнения этого шаблона в виде значения параметра headименованному шаблону head, воспользуемся следующей конструкцией:
Выходящий документ будет получен в виде:
H1 {border-width: 1; border: solid; text-align: center}
content
Выделенный фрагмент, как и в предыдущем случае, соответствует части документа, полученной при копировании значения параметра head.
Приведенные выше примеры демонстрируют, как можно собрать выходящий документ по кусочкам из фрагментов деревьев. При умелом использовании изложенные подходы позволяют добиться очень высокой гибкости и универсальности преобразований.
Читать дальше