Создание узлов элементов и атрибутов в XSLT
5.3.8.1. Элемент xsl:element
Каждому элементу документа XML соответствует узел элемента. Дочерними узлами узла элемента могут быть узлы его дочерних элементов, а также узлы комментариев, инструкций по обработке и текстовые узлы, которые представляют его непосредственное содержимое. Следует отметить, что узлы атрибутов не считаются дочерними узлами своего элемента, они лишь только ассоциируются с ними.
Узлы элементов в выходящем документе можно создавать с помощью литеральных элементов. Однако в тех случаях, когда требуется создать элемент с заранее неизвестным (например, вычисляемым во время выполнения) именем или создать элемент, принадлежащий пространству имен, известному обрабатывающему процессору, литеральные элементы не подходят.
Для создания элемента с вычисляемым названием используется элемент xsl:element, который имеет следующий синтаксис:
<xsl:element
name="имя"
namespace="пространство-имен"
inherit-namespaces="yes" | "no"
use-attribute-sets="имена"
type="имя-типа"
validation="strict" | "lax" | "preserve" | "strip"
>
<!--
Содержимое: конструктор последовательности
-->
</xsl:element>
Здесь обязательный атрибут name указывает имя создаваемого элемента. Этот атрибут может содержать шаблон значения, а значит, имя элемента может быть вычислено во время выполнения. Все остальные атрибуты элемента являются необязательными.
Атрибут namespace указывает URI пространства имен создаваемого элемента. Точно так же, как и name, этот атрибут может содержать шаблон значения, что позволяет вычислять пространство имен создаваемого элемента при помощи выражений.
В качестве значений атрибутов name и namespace могут быть использованы вычисляемые выражения, т.е. выражения, заключенные в фигурные скобки "{" и "}".
Атрибут inherit-namespaces задает ("yes") или отменяет ("no") наследование узлов пространства имен для потомков создаваемого элемента. По умолчанию значение этого атрибута равно "yes".
Атрибут use-attribute-sets перечисляет (через пробел) имена наборов атрибутов, которые должны быть включены в создаваемый элемент.
Атрибут type задает проверку создаваемого элемента на соответствие простому или комплексному типу, заданному в значении атрибута и определенному в схеме документа.
Атрибут validation определяет действия по проверке действительности создаваемого элемента. Значение "strip" этого атрибута указывает, что новый элемент и все содержащиеся в нем узлы должны иметь тип xs:untyped. Значение "preserve" указывает, что копируемые элементы сохраняют свой тип, а создаваемые элементы будут иметь тип xs:untyped. Значение "strict" указывает, что создаваемые и копируемые элементы должны строго соответствовать своему типу, определенному в схеме документа (в случае такого несоответствия выдается сообщение об ошибке). Значение "lax" аналогично значению "strict", за исключением того, что в случае несоответствия сообщения об ошибке не выдается, а создаваемые или копируемые элементы будут иметь тип xs:untyped.
Атрибуты type и validation являются взаимоисключающими, т.е. в элементе может быть задан только один из этих атрибутов.
Содержимым xsl:element является конструктор последовательности, который создается процессором и затем включается в создаваемый элемент.
5.3.8.2. Элемент xsl:attribute
Атрибутам того или иного элемента соответствуют узлы атрибутов. Считается, что узел элемента является родителем узла своего атрибута, но вместе с тем узел атрибута не является дочерним узлом узла его элемента. Такая ситуация отличает дерево документа в XSLT от дерева в DOM – отношение между элементом и атрибутом не является отношением наследования, а отношением ассоциации. Говорят, что узел атрибута ассоциируется с узлом элемента.
Узел атрибута задается конструкцией вида:
<xsl:attribute
name="имя"
namespace="пространство-имен"
select="выражение"
separator?="строка"
type="имя-типа"
validation="strict" | "lax" | "preserve" | "strip"
>
<!--
Содержимое: конструктор последовательности
-->
</xsl:attribute>
Использование элементов xsl:attribute и xsl:element во многом аналогично. Обязательный атрибут name задает имя атрибута, а все остальные атрибуты также являются необязательными.
Атрибут namespace задает URI пространства имен создаваемого атрибута.
Атрибут select задает строковое значение нового атрибута (альтернативным является задание значения атрибута в конструкторе последовательности элемента xsl:attribute).
Атрибут separator задает символы-разделители между элементами сгенерированной последовательности при их преобразовании в результирующее строковое значение. По умолчанию таким разделителем является одиночный пробел. Если в качестве разделителя задана пустая строка, разделителей между элементами не будет.
В качестве значений атрибутов name, namespace и separator могут быть использованы вычисляемые выражения, т.е. выражения, заключенные в фигурные скобки "{" и "}".
Атрибут type задает проверку создаваемого атрибута на соответствие простому или комплексному типу, заданному в значении атрибута и определенному в схеме документа.
Атрибут validation определяет действия по проверке действительности создаваемого узла документа. Значение "strip" этого атрибута указывает, что новый атрибут должен иметь тип xs:untypedAtomic. Значение "preserve" указывает, что копируемые атрибуты сохраняют свой тип, а создаваемые атрибуты будут иметь тип xs:untypedAtomic. Значение "strict" указывает, что создаваемые и копируемые атрибуты должны строго соответствовать своему типу, определенному в схеме документа (в случае такого несоответствия выдается сообщение об ошибке). Значение "lax" аналогично значению "strict", за исключением того, что в случае несоответствия сообщения об ошибке не выдается, а создаваемые или копируемые атрибуты будут иметь тип xs:untypedAtomic.
Атрибуты type и validation являются взаимоисключающими, т.е. в элементе может быть задан только один из этих атрибутов.
Если атрибут создается в элементе, который уже имеет атрибут с таким же именем, старый атрибут будет переопределен новым значением.
Использование элемента xsl:attribute имеет следующие основные особенности:
· атрибуты могут создаваться только в узлах элементов (если атрибут создается в узле, который не является узлом элемента, процессор может либо выдать ошибку, либо проигнорировать создаваемый атрибут);
· атрибуты могут содержать только текстовые узлы (процессор может либо выдать ошибку, либо проигнорировать нетекстовые узлы);
· узлы атрибутов должны быть первыми узлами, которые создаются в элементах (XSLT не разрешает создавать атрибуты после того, как в элемент включены дочерние узлы других типов);
· элемент не может использоваться для генерации объявлений пространств имен;
· элемент не может создавать атрибуты, имена которых имеют префикс xmlns;
· в случае, когда документ преобразуется в другой документ XML, символы перевода строки в элементе заменяются символьными сущностями.
Элемент xsl:attribute может быть использован в содержимом любого из следующих родителей:
· литерального элемента результата;
· элемента xsl:element;
· элемента xsl:copy в случае, если текущий, копируемый узел является элементом;
· элемента xsl:attribute-set в случае определения именованного набора атрибутов.
Элемент xsl:attribute обычно используется, если:
· требуется создать атрибут с не известным заранее именем или пространством имен;
· требуется создать атрибут в пространстве имен, которое является для процессора значащим (например, в пространстве имен XSLT);
· требуется создать атрибут, вычисление значения которого не может быть реализовано одним или несколькими выражениями XPath (например, условный вывод атрибута).
5.3.8.3. Элемент xsl:attribute-set
Для того чтобы упростить создание в элементах целых наборов атрибутов, можно заранее определить их в элементе xsl:attribute-set, который имеет следующий синтаксис:
<xsl:attribute-set
name="имя"
use-attribute-sets="имена"
>
<!--
Содержимое: элементы xsl:attribute
-->
</xsl:attribute-set>
Обязательный атрибут name задает имя набора атрибутов. В атрибуте use-attribute-sets через пробел перечисляются имена наборов атрибутов, которые должны быть использованы в данном элементе.
Элемент xsl:attribute-set содержит последовательность, состоящую из нуля или более элементов xsl:attribute.
Именованные наборы атрибутов можно использовать, указывая их имена в значении атрибута use-attribute-sets, который может присутствовать в элементах xsl:element, xsl:copy и xsl:attribute-set, а также в литеральных результирующих элементах.
Включение набора атрибутов в элемент равносильно простому копированию элементов xsl:attribute, определенных в соответствующих элементах xsl:attribute-set.
Пример использования элементов xsl:element, xsl:attribute и xsl:attribute-set:
Следующая таблица стилей формирует документ HTML для вывода тем сообщений в документе XML message.xml:
<?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"/>
<xsl:attribute-set name="hrAttrs">
<xsl:attribute name="width">25%</xsl:attribute>
<xsl:attribute name="color">green</xsl:attribute>
<xsl:attribute name="align">left</xsl:attribute>
</xsl:attribute-set>
<!-- Формирование выходного документа HTML -->
<xsl:template match="/">
<html>
<head>
<title>Вывод тем сообщений</title>
<style type="text/css">
.red {color:red}
.bold {font-weight:bold}
</style>
</head>
<body>
<!-- Применение правила шаблона для элемента message -->
<xsl:apply-templates
select="email-folder/message"/>
<!-- Задание элемента hr -->
<xsl:element name="hr"
use-attribute-sets="hrAttrs"/>
</body>
</html>
</xsl:template>
<!-- Задание правила шаблона для элемента message -->
<xsl:template match="message">
<!-- Задание элемента hr -->
<xsl:element name="hr"
use-attribute-sets="hrAttrs"/>
<!-- Задание элемента p -->
<p class="bold">Тема:
<!-- Задание элемента span -->
<xsl:element name="span">
<!-- Задание атрибута class для элемента span -->
<xsl:attribute
name="class">red</xsl:attribute>
<!-- Получение значения для элемента subject -->
<xsl:apply-templates
select="./header/subject/text()"/>
</xsl:element>
</p>
</xsl:template>
</xsl:stylesheet>
В результате преобразования документ HTML будет иметь следующий вид:
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=windows-1251">
<title>Вывод тем сообщений</title>
<style type="text/css">
.red {color:red}
.bold {font-weight:bold}
</style>
</head>
<body>
<hr width="25%" color="green" align="left">
<p class="bold">Тема:<span
class="red">Поздравление</span></p>
<hr width="25%" color="green" align="left">
<p class="bold">Тема: <span
class="red">Напоминание</span></p>
<hr width="25%" color="green" align="left">
<p class="bold">Тема: <span
class="red">Отказ</span></p>
<hr width="25%" color="green" align="left">
<p class="bold">Тема: <span
class="red">Вопрос</span></p>
<hr width="25%" color="green" align="left">
<p class="bold">Тема: <span
class="red">Ответ</span></p>
<hr width="25%" color="green" align="left">
</body>
</html>
и в Web-браузере будет выведено:
Дата добавления: 2015-03-20; просмотров: 1403;