Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-08.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
422.91 Кб
Скачать

5.3.18.2. Вызов именованных правил шаб­лона

Для вызова именованных правил шаб­лона (с атрибутом name) вXSLTиспользуется элементxsl:call-templates, который имеет следующий синтаксис:

<xsl:call-template

name="имя">

<!--

Содержимое: элементы xsl:with-param

-->

</xsl:call-template>

Обязательный атрибут nameуказывает имя правила шаблона, который вызывается этой инструкцией. Например, правило шаблона с именем "head", приведенное выше, может быть вызван следующим образом:

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

При вызове xsl:call-templateне изменяет контекста преобразования, Фактически, вызов именованного правила шаблона эквивалентен замене в тексте преобразования элементаxsl:call-templateна тело вызываемого шаблона.

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

Между вызовом правила шаблона с помощью элемента xsl:apply-templatesи с помощью элементаxsl:call-templateсуществуют следующие основные отличия:

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

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

  • элемент xsl:apply-templatesпозволяет использовать различные ре­жимы, а элементxsl:call-templateвыполняет правило шаблона с заданным именем вне зависимо­сти от того, в каком режиме происходит обработка и каково значение ат­рибутаmodeэтого правила;

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

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

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

5.3.18.3. Параметры в xslt

Параметры в XSLTпрактически полностью идентичны переменным. Они точно так же связывают с объектом имя, посредством которого в дальней­шем можно к этому объекту обращаться. Главным различием является то, что значение, данное параметру при инициализации, является всего лишь значением по умолчанию, которое может быть переопределено при вызове.

Если представить правила шаблонов, не как правила, а как функции, каждая из которых преобразует некоторый узел и воз­вращает фрагмент дерева в качестве результата, то парамет­ры правил шаблонов можно рассматривать как аргументы этих функций.

Работа с параметрами обеспечивается двумя элементами: xsl:param, кото­рый объявляет в правиле шаблона новый параметр иxsl:with-param, который ука­зывает значение параметра при вызове правила.

Элемент xsl:paramимеет следующий синтаксис:

<xsl:param

name="имя"

select="выражение"

as="тип-переменной"

required="yes" | "no"

tunnel="yes" | "no"

>

<!--

Содержимое: конструктор последовательности

-->

</xsl:param>

Элемент xsl:template, задающий в преобразовании правило шаблона, может включать несколько элементовxsl:param, которые и будут опреде­лять параметры этого правила. Кроме этого,xsl:paramможет указываться в виде элемента верхнего уровня: в этом случае он будет определять глобаль­ный параметр.

Элемент xsl:paramобъявляет параметр с именем, которое задается обязательным атрибутомname. Имя параметра может иметь расширенную форму, например "user:param", но обычно параметрам дают простые имена. Все остальные атрибуты являются необязательными.

Если параметр не задается при вызове и если параметр не является обязательным, то значение параметра задается либо с помощью выражения в атрибуте select, либо в конструкторе последовательности.

Необязательный атрибут asзадает тип переменной (один из типов XPath).

Атрибут requiredзадает тип параметра: обязательный ("yes") или необязательный ("no"). Если параметр является параметром функции, то он по умолчанию является обязательным и атрибутrequiredзадавать не надо.

Атрибут tunnelзадает, является ли параметр туннельным ("yes") или нет ("no"). Туннельный параметр автоматически передается вызванным шаблоном тому шаблону, который, в свою очередь вызывается вызванным шаблоном. По умолчанию значение этого атрибута равно "no".

Параметру может быть присвоено значение по умолчанию, т.е. значе­ние, которое будет использоваться в случае, если параметра с таким именем правилу шаблона передано не было. Значение по умолчанию вычисляется следую­щим образом:

  • если в элементе xsl:paramопределен атрибутselect, то значением по умолчанию будет результат вычисления выражения, указанного в этом атрибуте;

  • если атрибут selectне определен, но сам элементxsl:paramимеет до­черние узлы, то значением определяемого параметра по умолчанию будет фрагмент дерева, полученного в результате выполнения содержимогоxsl:param;

  • если атрибут selectне определен и при этом сам элементxsl:paramпуст, то значением параметра по умолчанию будет пустая строка.

Примеры объявления параметров:

1. Элемент

<xsl:param name="x" select="2 * 2"/>

создаст параметр, значением которого по умолчанию будет 4.

2. Элемент

<xsl:param name="x"/>

то есть, когда в нем нет ни атрибута select, ни содержимого, присвоит па­раметру пустую строку, то есть будет эквивалентно

<xsl:param name="x" select="''"/>

Точно так же, как и в случае с переменными, значение заданного в правиле шаблона параметра можно использовать в выражениях, добавляя перед именем пара­метра префикс "$". К примеру, значение параметраxможет быть получено с помощью обращения$x.

Область видимости параметров определяется в точности так же, как область видимости переменных. Однако следует учитывать, что элементы xsl:param, определяемые в правилах шаблона, долж­ны всегда быть его первыми дочерними элементами. Поэтому область видимости локальных параметров определяется несколько иначе, чем области видимости локальных переменных: после определения параметр может использоваться в правиле где угодно.

Для того чтобы передать в правило шаблона определенные значения параметров, эле­менты, которые вызывают этот шаблон, должны содержать один или не­сколько элементов xsl:with-param. Глобальные параметры, объявленные элементамиxsl:paramверхнего уров­ня, также могут быть переданы преобразованию, однако конкретный меха­низм реализации этой передачи целиком и полностью зависит от реализа­ции конкретного процессора.

Элемент xsl:with-paramимеет следующий синтаксис:

<xsl:with-param

name="имя"

select="выражение"

as="тип-переменной"

tunnel="yes" | "no"

>

<!--

Содержимое: конструктор последовательности

-->

</xsl:with-param>

Как видно из синтаксиса, элемент xsl:with-paramидентичен эле­ментуxsl:param(отличаются только их имена). Действуют они также практически одинаково: элементxsl:with-paramтоже связывает с именем параметра значение, и при выполнении шаблона это значение будет исполь­зоваться вместо значения параметра по умолчанию.

Таким образом, значение параметра, заданного в шаблоне, выбирается в соответствии со следующими положениями:

  • если в элементе, который вызывает этот шаблон, присутствует элемент xsl:with-param, передающий значение этого параметра, в шаблоне будет использоваться переданное значение;

  • если в элементе, который вызывает этот шаблон, элемента xsl:with-param, с соответствующим именем нет, в качестве значения параметра будет использоваться значение по умолчанию.

Элемент xsl:with-paramможет использоваться только в качестве дочернего элементаxsl:apply-templatesиxsl:call-template.

Параметры могут быть использованы как в именованных, так и в неименован­ных правилах шаблона. Именованные правила с параметрами ведут себя как функции, т.е. они могут вызываться с определенными параметрами вне зависимости от контекста, только чтобы выполнить какие-либо действия с пе­реданными значениями. В случае обычных, неименованных правил, парамет­ры могут предоставлять некую дополнительную информацию.

Пример использования параметра в именованном шаблоне:

Пусть задан шаблон с именем day-name, который выводит сокраще­ние названия для недели по его номеру. Номер дня передается в шаблон параметром с именемday-number.

<xsl:template name="day-name">

<xsl:param name="day-number" select="0"/>

</xsl:template>

Вызов шаблона выполняется с помощью следующего элемента:

<xsl:call-template name="day-name">

<xsl:with-param name="day-number" select="l"/>

</xsl:call-template>

Пример использования параметра в неименованном шаблоне:

<xsl:template match="menuitem">

<xsl:param name="current" select="1"/>

</xsl:template>

Вызов этого шаблона выполняется с помощью следующего элемента:

<xsl:template match="menu">

<xsl:apply-templates select="menuitem">

<xsl:with-param name="current"/>

</xsl:apply-templates>

</xsl:template>.

Поскольку при вызове атрибут selectне указан, будет использовано значение по умолчанию (select="l").

Соседние файлы в папке Лекции