Создание узлов элементов и атрибутов в 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.042 сек.