Валиков Алексей Н.
Шрифт:
<xsl:call-template name="head"/>
Атрибут
name
при вызове обязан иметь фиксированное значение — точно так же, как и в случае с mode
и xsl:apply-templates
, динамика здесь не разрешена. При вызове
xsl:call-template
не изменяет контекста преобразования. Фактически, вызов именованного шаблона эквивалентен замене в тексте преобразования элемента xsl:call-template
на тело вызываемого шаблона. Приведем пример.
Листинг 5.6. Входящий документ
<content>
Just a few words...
</content>
Листинг 5.7. Преобразование
<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="#"/>
</head>
</xsl:template>
</xsl:stylesheet>
Листинг 5.8. Выходящий документ
<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="#">
</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="#"/>
</head>
<body><xsl:value-of select="content"/></body>
</html>
</xsl:template>
В принципе именованные шаблоны не обязаны иметь атрибут
match
, но он все же может быть определен. В этом случае шаблон можно будет применять как для обработки частей документов элементом xsl:apply-templates
, так и вызывая его по имени элементом xsl:call-template
. Пример
Изменим объявление нашего шаблона head следующим образом:
<xsl:template name="head" match="head">
...
</xsl:template>
Теперь, если входящий документ будет иметь вид
<page>
<head/>
<content>Just a few words...</content>
</page>
то результат выполнения следующих двух шаблонов будет одинаков.