<a href='{@href}'>
<xsl:value-of select='@name'/>
</a>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Результатом выполнения шаблона
<xsl:template match='menu'>
<xsl:apply-templates select='menuitem'>
<xsl:with-param name='current' select='3'/>
</xsl:apply-templates>
</xsl:template>
будет фрагмент меню вида
<a href='home.htm'>Home</a>
<a href='news.htm'>News</a>
<b>Profile</b>
<a href='contact.htm'>Contact</a>
Попробуем теперь обработать элементы menuitem, не указывая значение параметра current:
<xsl:template match='menu'>
<xsl:apply-templates select='menuitem'/>
</xsl:template>
Результат будет получен в виде:
<b>Home</b>
<а href='news.htm'>News</a>
<а href='profile.htm'>Profile</a>
<a href='contact.htm'>Contact</a>
Этот фрагмент выходящего документа легко объяснить. Вследствие определения:
<xsl:param name='current' select='1'/>
значением параметра current по умолчанию является 1, и поэтому в меню был выбран пункт с индексом 1.
Мы упомянули, что значением параметра может быть дерево. Попробуем пояснить эту концепцию на примере генерации HTML-документа.
Итак, предположим, что мы генерируем выходящий документ следующим именованным шаблоном:
<xsl:template name='html'>
<xsl:param name='head'>
<head>
<title>Title one</title>
</head>
</xsl:param>
<html>
<xsl:copy-of select='$head'/>
<body>
<xsl:text>content</xsl:text>
</body>
</html>
</xsl:template>
Параметр head по умолчанию будет содержать дерево, состоящее из элемента head и его дочернего элемента title, который содержит текст 'Title one'. Результат выполнения вызова
<xsl:call-template name='html'/>
мы можем видеть на следующем листинге:
<html>
<head>
<title>Title one</title>
</head>
<body>content</body>
</html>
Выделенный фрагмент относится к части дерева, которая была создана копированием значения параметра head.
Попробуем теперь передать в качестве параметра дерево, сгенерированное следующим шаблоном:
<xsl:template name='head'>
<head>
<title>Title two</title>
<style type='text/css'>
H1 {border-width: 1; border: solid; text-align: center}
</style>
</head>
</xsl:template>
Для того чтобы передать результат выполнения этого шаблона в виде значения параметра head именованному шаблону head, воспользуемся следующей конструкцией:
<xsl:call-template name='html'>
<xsl:with-param name='head'>
<xsl:call-template name='head'/>
</xsl:with-param>
</xsl:call-template>
Выходящий документ будет получен в виде:
<html>
<head>
<title>Title two</title>
<style type='text/css'>
H1 {border-width: 1; border: solid; text-align: center}
</style>
</head>
<body>content</body>
</html>
Выделенный фрагмент, как и в предыдущем случае, соответствует части документа, полученной при копировании значения параметра head.
Приведенные выше примеры демонстрируют, как можно собрать выходящий документ по кусочкам из фрагментов деревьев. При умелом использовании изложенные подходы позволяют добиться очень высокой гибкости и универсальности преобразований.
