
- •Лекция 4-08
- •5.3.9. Создание текстовых узлов вXslt
- •5.3.9.1. Элементxsl:text
- •5.3.9.2. Элементxsl:value-of
- •5.3.9.3. Встроенные правила шаблона
- •1. Поздравление
- •2. Напоминание
- •5.3.9.4. Обработка пробельных символов
- •5.3.10. Создание узлов документа, комментариев, инструкций по обработке и пространства имен вXslt
- •5.3.10.1. Элемент xsl:document
- •5.3.10.2. Элементxsl:result-document
- •5.3.10.3. Элементxsl:comment
- •5.3.10.4. Элемент xsl:processing-instruction
- •5.3.10.5. Элементxsl:namespace
- •5.3.11. Копирование узлов вXslt
- •5.3.11.1. Элементxsl:copy
- •5.3.11.2. Элементxsl:copy-of
- •5.3.11.3. Элементxsl:sequence
- •5.3.12. Условная и циклическая обработка вXslt
- •5.3.12.1. Элементxsl:if
- •5.3.12.2. Элементы xsl:choose, xsl:when и xsl:otherwise
- •5.3.12.3. Элементxsl:for-each
- •5.3.12.4. Сортировка вXslt
- •5.3.13. Сообщения процессораXslt
- •5.3.14. Псевдонимы пространства имен вXslt
- •5.3.15. Нумерация вXslt
- •3. Поздравление
- •1. Поздравление
- •1. Поздравление
- •01). Поздравление
- •0:00:00:00:01)Поздравление
- •5.3.16. Форматирование чисел в xslt
- •5.3.17. Использование ключей вXslt
- •5.3.18. Переменные, параметры и функции вXslt
- •5.3.18.1. Переменные в xslt
- •5.3.18.2. Вызов именованных правил шаблона
- •5.3.18.3. Параметры в xslt
- •5.3.18.4. Функции стилей в xslt
- •5.3.19. Дополнительные функции xslt
- •5.3.19.1. Функцияdocument()
- •5.3.19.2. Функцияcurrent()
- •5.3.19.3. Функцияgenerate-id()
- •5.3.19.4. Функция system-property()
- •5.3.19.5. Функцияunparsed-entity-uri()
- •5.3.20 Использование расширений вXslt
- •5.3.20.1. Средства расширенияXslt
- •5.3.20.2. Инициатива exslt
- •5.3.20.3. Средства расширения в процессореMsxml
- •5.3.20.4. Средства расширения в процессореSaxon
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").