<xsl:call-template> XSLT

Элемент xsl:call-template вызывает шаблон по имени, он содержит обязательный атрибут name, идентифицирующий шаблон, который должен быть вызван.

В отличие от xsl:apply-templates, xsl:call-template не меняет текущий узел и текущий набор узлов.

Элементы-потомки:

Синтаксис

XSLT 1.0, XSLT 2.0 и XSLT 3.0

<xsl:call-template
    name = "имя">
    <!-- Содержимое: xsl:with-param* -->
</xsl:call-template>

Атрибуты

  • nameобязательный атрибут, задает имя шаблона, который вызывается этой инструкцией. Атрибут name при вызове обязан иметь фиксированное значение.

Спецификация

Описание и примеры

Пример 1

Входящий документ:

<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>

Пример 2

В принципе именованные шаблоны не обязаны иметь атрибут 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>

то результат выполнения следующих двух шаблонов будет одинаков.

Шаблон для page — версия 1:

<xsl:template match="page">
    <html>
        <xsl:apply-templates select="head"/>
        <body>
            <xsl:copy-of select="content/node()/>
        </body>
    </html>
</xsl:template>

Шаблон для page — версия 2:

<xsl:template match="page">
    <html>
        <xsl:call-template name="head"/>
        <body>
            <xsl:copy-of select="content/node()/>
        </body>
    </html>
</xsl:template>

В XSLT 2.0 правила передачи параметров шаблонам слегка изменились:

  • В XSLT 1.0 шаблону можно было передать любое количество параметров; лишние параметры (т. е. параметры, не определенные в вызываемом шаблоне) игнорировались. В XSLT 2.0 это приводит к фатальной ошибке.
  • В XSLT 2.0 элемент <xsl:param> поддерживает атрибут required. Вызов шаблона без передачи значений всех обязательных параметров приводит к фатальной ошибке.
  • В XSLT 2.0 появилась концепция туннельных параметров.

См. также

  • xsl:apply-templates — применяет шаблонные правила к узлам.
  • xsl:with-param — связывает с именем параметра значение.

Ссылки

MDN xsl:call-template на MDN
MSDN xsl:call-template на MSDN