переопределяют младшие шаблоны
При генерации HTML-страниц часто встречающейся задачей является создание элемента head
. Элемент head
, как правило, содержит несколько элементов meta
, предоставляющих метаинформацию, элемент title
, который определяет название страницы и элемент link
, который связывает данную страницу с другими документами, например, с каскадными таблицами стилей (CSS).
Для того чтобы упростить процедуру генерации head
, мы можем вынести ее в отдельный именованный шаблон.
<xsl:template name='head'>
<head>
<meta name='keywords' content='XSLT, XPath, XML'/>
<meta name='description'
content='This site is dedicated to XSLT and Xpath.'/>
<title>XSLTdev.ru - XSLT developer resource</title>
<link rel='stylesheet' type='text/css' href='style/main.css'/>
</head>
</xsl:template>
Думается, этот шаблон не требует пояснений — он просто создает в входящем документе несколько элементов. Непонятным пока остается другое — как вызывать именованные шаблоны? Элемент xsl:apply-templates
явно не подходит, поскольку именованные шаблоны не обязаны иметь атрибут match
. Их выполнение производится элементом xsl:call-template
.
Элемент
Приведем синтаксис этого элемента:
<xsl:call-template
name='
<!-- Содержимое: несколько элементов xsl:with-param -->
</xsl:call-template>
Обязательный атрибут name указывает имя шаблона, который вызывается этой инструкцией. Например, шаблон с именем 'head
', приведенный выше, может быть вызван следующим образом:
<xsl:call-template name='head'/>
Атрибут name
при вызове обязан иметь фиксированное значение — точно так же, как и в случае с mode
и xsl:apply-templates
, динамика здесь не разрешена.
При вызове xsl:call-template
не изменяет контекста преобразования. Фактически, вызов именованного шаблона эквивалентен замене в тексте преобразования элемента xsl:call- template
на тело вызываемого шаблона.
Приведем пример.
<content>
Just a few words...
</content>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<html>
<xsl:call-template name='head'/>
<body><xsl:copy-of select='content/node()'/></body>
</html>
</xsl:template>
<xsl:template name='head'>
<head>
<meta name='keywords' content='XSLT, XPath, XML'/>
<meta name='description'
content='This site is dedicated to XSLT and Xpath.'/>
<title>XSLTdev.ru - XSLT developer resource</title>
<link rel='stylesheet' type='text/css' href='style/main.css'/>
</head>
</xsl:template>
</xsl:stylesheet>
<html>
<head>
<meta name='keywords' content='XSLT, XPath, XML'>
<meta name='description'
content='This site is dedicated to XSLT and Xpath.'>
<title>XSLTdev.ru - XSLT developer resource</title>
<link rel='stylesheet' type='text/css' href='style/main.css'>
</head>
<body>Just a few words...</body>
</html>
Несколько более эффективным способом использования в документе статических частей (как содержимое элемента head
в приведенном примере) является хранение этих частей во внешних документах и вставка их в выходящий документ при помощи элемента xsl:copy-of
и функции document
.
В этом примере шаблон, обрабатывающий корневой элемент, фактически эквивалентен шаблону вида:
<xsl:template match='/'>
<html>
<head>
<meta name='keywords' content='XSLT, XPath, XML'/>
<meta name='description'
content='This site is dedicated to XSLT and Xpath.'/>
<title>XSLTdev.ru - XSLT developer resource</title>
<link rel='stylesheet' type='text/css' href='style/main.css'/>