Объявление шаблона
Объявление шаблона задается элементом xsl:template, который имеет следующий синтаксис:
<xsl:template
match="образец"
name="имя"
priority="число"
mode="режимы"
as="тип"
> .
<!--
Содержимое: элементы xsl:param,
конструктор-последовательности
-->
</xsl:template>
Это объявление определяет шаблон, который содержит 0 и более элементов xsl:param, а также конструктор последовательности для создания набора узлов и/или атомарных значений.
Все атрибуты элемента xsl:template являются необязательными.
Атрибут match задает образец узлов дерева, для которых необходимо применить преобразования. Если элемент xsl:template содержит атрибут match, он называется правилом шаблона.
Правила шаблона вызываются при помощи инструкции xsl:apply-templates.
Объявление шаблона также может иметь имя, определяемое атрибутом name. Такое объявление называется именованным шаблоном.
Именованные шаблоны вызываются при помощи инструкции xsl:call-template.
Именованные шаблоны могут вызываться вне зависимости от текущего контекста, и даже вести себя как функции – принимать на вход параметры и возвращать некоторые значения.
При объявлении шаблона нужно обязательно указать хотя бы один из атрибутов match или name, причем эти атрибуты могут присутствовать в xsl:template одновременно. Если атрибут match не задан, атрибуты priority и mode игнорируются.
Атрибут priority используется для определения числового значения, которое называется приоритетом шаблона (чем больше число, тем больше приоритет). Это значение используется для разрешения конфликтов шаблонов в случае, когда один узел может быть обработан различными объявлениями шаблонов. Если атрибут не priority задан, используются довольно сложные правила приоритета по умолчанию, зависящие от выражения в атрибуте match. Упрощенно можно считать, что более точно определенный образец имеет более высокий приоритет, чем менее точно определенный, т.е. правило с образцом "/message/header" имеет более высокий приоритет, чем правило "//header".
Атрибут mode определяет режим или режимы обработки данного объявления шаблона. Режимы задаются как идентификаторы типа token, отделенные друг от друга пробелами. Режимы позволяют задавать различные преобразования для одних и тех же частей документа (имена этих режимов используются в элементе xsl:apply-templates). Существует два предопределенных имени режимов: "#default" (режим по умолчанию, действующий, когда режим не задан) и "#all" (правило действует для всех режимов).
Атрибут as задает тип возвращаемого функцией значения (один из типов XPath 2.0). Если этот атрибут задан, результат выполнения конструктора последовательности преобразуется к заданному типу. Если такое преобразование невозможно, генерируется сообщение об ошибке. Если атрибут as не задан, преобразование результата не выполняется и тип элементов результата по умолчанию становится item(), что предполагает любой тип.
Атрибуты объявления шаблона не влияют на выполнение его содержимого. Они используются элементами xsl:apply-templates и xsl:call-template при выборе шаблонов. Правила, которые были импортированы в преобразование, вызываются могут быть вызваны элементом xsl:apply-imports.
В правиле шаблоне можно использовать не только элементы языка XSLT, но и строковые (литеральные) элементы.
Когда процессор выполняет правило шаблона, содержащее литеральные элементы, для них в результирующем документе создаются элементы с тем же расширенным именем и атрибутами, содержимым которых является результат выполнения содержимого литерального элемента в преобразовании, т.е. литеральные элементы выводятся в результирующий документ без изменений; но их содержимое при этом все же выполняется.
Помимо литеральных элементов тело правила шаблона может также содержать следующие элементы XSLT, называемые инструкциями:
· xsl:apply-imports;
· xsl:apply-templates;
· xsl:attribute;
· xsl:call-template;
· xsl:choose;
· xsl:comment;
· xsl:copy;
· xsl:copy-of;
· xsl:element;
· xsl:fallback;
· xsl:for-each;
· xsl:if;
· xsl:message;
· xsl:number;
· xsl:param;
· xsl:processing-instruction;
· xsl:text;
· xsl:value-of;
· xsl:variable.
Элементы xsl:param и xsl:variable в теле шаблона определяют локальные параметры и переменные.
5.3.7.3. Вызов неименованных правил шаблона
Для применения правил шаблона (в которых не задан атрибут name) в XSLT используется элемент-инструкция xsl:apply-templates.
Этот элемент имеет следующий синтаксис:
<xsl:apply-templates
select="выражение"
mode="режим">
<!--
Содержимое: элементы xsl:sort или xsl:with-param
-->
</xsl:apply-templates>
Элемент xsl:apply-templates получает на входе последовательность узлов, соответствующих образцу, заданному в атрибуте match элемента xsl:template. Необязательный атрибут select задает выражение, результатом которого является последовательность узлов, которая является выборкой из исходной последовательности узлов. Если атрибут select не задан, то правила шаблона применяются ко всем дочерним узлам текущего узла, т.е. инструкция
<xsl:apply-templates/>
действует так же, как инструкция
<xsl:apply-templates select="child::node()"/>
В результате выполнения элемента xsl:apply-templates получается последовательность компонент, которая чаще всего добавляется к результирующей иерархической структуре.
Оба элемента xsl:template и xsl:apply-templates имеют необязательный атрибут mode. Если элемент xsl:template не имеет атрибута match, то он не должен иметь и атрибута mode. Если элемент xsl:apply-templates имеет атрибут mode, то он применяется только к тем правилам шаблона из элементов xsl:template, которые имеют атрибут mode с тем же значением, либо имеют значение атрибута mode, равное "#all". Если элемент xsl:apply-templates атрибута mode не имеет, то он применяется только к тем правилам шаблона из элементов xsl:template, которые также не имеют атрибута mode, либо имеют значение атрибута mode, равное "#default". В элементе xsl:apply-templates существует два предопределенных имени режимов: "#default" (режим, действующий по умолчанию) и "#current" (текущий режим).
Пример использования элементов xsl:template и xsl:apply-templates:
Вывод тем сообщений для документа XML email.xml (см. 5.1.1.5.2).
Преобразование XSLT имеет следующий вид:
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" version="4.0"
encoding="windows-1251" indent="yes"/>
<!-- Формирование выходного документа HTML -->
<xsl:template match="/">Вывод тем сообщений
<html>
<head>
<title> Вывод тем сообщений</title>
</head>
<body>
<!-- Применение правила шаблона для элемента subject -->
<xsl:apply-templates select="//subject"/>
</body>
</html>
</xsl:template>
<!-- Задание правила шаблона для элемента subject -->
<xsl:template match="subject">
<p>
<span
style="font-weight:bold;color:blue">Тема: </span>
<xsl:apply-templates/>
</p>
</xsl:template>
</xsl:stylesheet>
Сформированный выходной документ HTML имеет следующий вид:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251">
<title>Вывод тем сообщений</title>
</head>
<body>
<p><span style="font-weight:bold;color:blue">
Тема: </span>Поздравление</p>
<p><span style="font-weight:bold;color:blue">
Тема: </span>Напоминание</p>
<p><span style="font-weight:bold;color:blue">
Тема: </span>Отказ</p>
<p><span style="font-weight:bold;color:blue">
Тема: </span>Вопрос</p>
<p><span style="font-weight:bold;color:blue">
Тема: </span>Ответ</p>
</body>
</html>
Вывод результата преобразования в Web-браузере будет иметь следующий вид:
Дата добавления: 2015-03-20; просмотров: 623;