Элемент xsl:call-template

Элемент 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 на тело вызываемого шаблона.

Приведем пример.

Листинг 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="style/main.css"/>

 </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="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"/>

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

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

Листинг 5.9. Шаблон для page — версия 1

<xsl:template match="page">

 <html>

  <xsl:apply-templates select="head"/>

  <body><xsl:copy-of select="content/node()/></body>

 </html>

</xsl:template>

Листинг 5.10. Шаблон для page — версия 2

<xsl:template match="page">

 <html>

  <xsl:call-template name="head"/>

  <body><xsl:copy-of select="content/node()/></body>

 </html>

</xsl:template>

В чем же состоит разница вызова шаблона элементами xsl:apply-templates и xsl:call-template? Перечислим несколько отличий.

? Элемент xsl:apply-templates применяет подходящие шаблоны к узлам определенного множества; xsl:call-template просто выполняет тело фиксированного именованного шаблона.

? При вызове шаблона инструкцией xsl:apply-templates происходит изменение контекста — обрабатываемое множество узлов становится текущим списком узлов преобразования, а обрабатываемый узел — текущим узлом; xsl:call-template не изменяет контекст преобразования.

? Инструкция xsl:apply-templates позволяет использовать различные режимы — применяются только те шаблоны, значение атрибута mode которых равно значению этого атрибута у вызывающей инструкции; xsl:call-template выполняет шаблон с заданным именем вне зависимости от того, в каком режиме происходит обработка и каково значение атрибута mode этого шаблона.

? Если для обработки определенного узла подходит несколько шаблонов, то при выполнении xsl:apply-templates процессор будет выбирать наиболее подходящий из них; xsl:call-template всегда будет выполнять тот единственный шаблон преобразования, который имеет указанное имя.

? Если в преобразовании не определен шаблон для обработки некоторого узла, но к нему элементом xsl:apply-templates все же применяются шаблоны, процессор будет использовать шаблон обработки по умолчанию; если элемент xsl:call-template вызывает отсутствующий шаблон, процессор выдаст сообщение об ошибке, потому что не сможет найти шаблон с заданным именем.

? При использовании xsl:apply-templates процессор игнорирует значения атрибутов name элементов xsl:template; точно так же xsl:call-template принимает во внимание только значение атрибута name, игнорируя атрибуты match, mode и priority.

При желании можно найти еще с десяток отличий, но и этих положений вполне достаточно для того, чтобы понять разницу. Главным выводом из этого сравнения является то, что xsl:apply-templates демонстрирует декларативный, а xsl:call-template процедурный стиль программирования В первом случае мы используем объявленные (или задекларированные) правила преобразования, во втором — используем шаблон просто как процедуру.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Дополнение Pamela Call Recorder

Из книги Skype: бесплатные звонки через Интернет. Начали! автора Гольцман Виктор Иосифович

Дополнение Pamela Call Recorder Из данного подраздела вы узнаете, как загрузить доступное для программы Skype дополнение Pamela Call Recorder. Оно позволит вам записывать входящие и исходящие звонки, добавлять звуки. Установим дополнение для программы Skype и рассмотрим работу с ним.1.


Инсталляция с помощью Установщика шаблонов (Template Installer) Joomla!

Из книги Создание шаблонов Joomla автора Автор неизвестен

Инсталляция с помощью Установщика шаблонов (Template Installer) Joomla! После создания пакета шаблона и удаления всех его предыдущих версий можно перейти к инсталляции нового шаблона (в главном меню админчасти выберите Extensions | Install/Uninstall).Здесь можно установить zip пакет с вашим


Элемент

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Элемент <?job?> Элемент <?job?> задает режим отладки при выполнении WS-файла. Если значение атрибута debug равно true, то задание может быть выполнено во внешнем отладчике (см. приложение 3). Если же значение атрибута debug равно false, то отладчик для этого задания применен быть не


Элемент

Из книги Справочник по Flash автора Коллектив авторов

Элемент <job> Элементы <job> позволяют определять несколько заданий (независимо выполняющихся частей) в одном WS-файле. Иначе говоря, между тегами <job> и </job> будет находиться отдельный сценарий (который, в свою очередь, может состоять из нескольких частей,


Элемент

Из книги Моделирование бизнес-процессов с BPwin 4.0 автора Маклаков Сергей Владимирович

Элемент <example> Внутри элемента <example> приводится текст из одной или нескольких строк, в котором можно описать примеры запуска сценария. Если сценарий был запущен с ключом /? в командной строке или в сценарии встретился вызов метода ShowUsage объекта WshArguments, то этот текст


call - Выполнить сценарий удаленного клипа

Из книги XSLT автора Хольцнер Стивен

call - Выполнить сценарий удаленного клипа call(Глобальная функция)Вызывает из текущего скрипта скрипт, который прикреплен к указываемому кадруСинтаксис:call(frameLabel)call(frameNumber)Аргументы:Описание:Функция call() выполняет сценарий, прикрепленный к кадру с меткой frmaeLabel или номером


2.1.2. Создание отчетов с помощью Report Template Builder

Из книги Технология XSLT автора Валиков Алексей Николаевич

2.1.2. Создание отчетов с помощью Report Template Builder Собственный шаблон отчета можно создать с помощью диалога Report Template Builder. Пункт меню Tools/Reports Builder вызывает диалог Report Templates (рис. 2.1.3). Кнопка New служит для создания нового шаблона, кнопка Edit - для редактирования существующего.


Элемент

Из книги Как спроектировать современный сайт автора Вин Чои

Элемент <xsl:template> Шаблоны XSL позволяют задать способ выполнения вашего преобразования. Каждый элемент <xsl:template> устанавливается для выбора одного узла (который может содержать другие узлы) или ряда узлов в исходном документе, а также точного указания способа


Элемент

Из книги автора

Элемент <xsl:if> При помощи элемента <xsl:if> осуществляются проверки условия и принимаются действия на основе результата проверки. Он во многом похож на оператор if в языках программирования. У элемента <xsl:if> один атрибут:• test (обязательный). Устанавливается в


Элемент : применение именованных шаблонов

Из книги автора

Элемент <xsl:call-template>: применение именованных шаблонов У элемента <xsl:template> есть атрибут name, задающий имя шаблона. Предположим, у меня есть элемент буквального результата, состоящий из двух элементов <BR> и двух элементов <HR> HTML, при помощи которого я создаю в


Элемент xsl:template

Из книги автора

Элемент xsl:template Синтаксис этого элемента приведен ниже:<xsl:template match="пaттерн" name="имя" priority="число" mode="имя"> <!-- Содержимое: несколько элементов xsl:param, тело шаблона --></xsl:template>Элемент верхнего уровня xsl:template определяет в преобразовании шаблонное правило, или просто


Элемент

Из книги автора

Элемент Элементы – это любые единичные компоненты структуры, например, заголовок, абзац текста, фотография или