Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

 <xsl:attribute name="href">

<xsl:text>http://www.bbb.com</xsl:text>

 </xsl:attribute>

</a>

Листинг 7.7. Результат

<a href="#"/>

Поскольку атрибут может содержать только текст, результатом выполнения содержимого

xsl:attribute
тоже должны быть только текстовые узлы. Процессор в лучшем случае проигнорирует нетекстовые узлы, в худшем выведет сообщение об ошибке, прервав дальнейшую обработку, так что следует очень
внимательно относиться к содержимому
xsl:attribute
.

Текстовое значение атрибута может задаваться не только символьными данными, Оно может генерироваться также элементами XSLT, такими, как, например,

xsl:text
и
xsl:value-of
. То есть вполне корректным будет следующее определение:

<xsl:attribute name="href">

 <xsl:text>http://</xsl:text>

 <xsl:value-of select="concat('www', '.', 'bbb')"/>

 <xsl:text>.com</xsl:text>

</xsl:attribute>

В том случае, если текстовое значение атрибута содержит символы перевода строки, при генерации атрибута они будут заменены сущностями, то есть определение

<xsl:attribute name="href">а¶

 b</xsl:attribute>

создаст атрибут с именем "

href
" и значением "
a&#xA;b
":

<а href="#"/>

Техническая рекомендация объясняет такую ситуацию следующим образом: в соответствии со стандартом языка XML, символы перевода строки должны нормализоваться в значениях атрибутов пробелами, сущности же нормализовать не нужно. Но если бы символ перевода строки нормализовался в XSLT при выводе пробелом, то определения

<xsl:attribute name="href">a□b</xsl:attribute>

и

<xsl:attribute name="href">a¶

b</xsl:attribute>

были бы эквивалентны, что не отражает реального положения вещей. Для того чтобы исправить эту несуразицу, символ перевода строки при выводе в атрибуте нормализуется в XSLT символьной сущностью (

&#xA;
или
&#10;
).

Подводя итог, перечислим в краткой форме основные особенности обращения с

xsl:attribute
.

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

□ Атрибуты могут содержать только текстовые узлы. Процессор может либо выдать ошибку, либо проигнорировать нетекстовые узлы.

□ Узлы атрибутов должны быть первыми узлами, которые создаются в элементах. XSLT не разрешает создавать атрибуты после того, как в элемент включены дочерние узлы других типов.

□ В случае, когда документ преобразуется в другой XML-документ, символы перевода строки в элементе заменяются символьными сущностями.

Именованные наборы атрибутов

Элемент xsl:attribute-set

Синтаксис элемента определяется следующей конструкцией:

<xsl:attribute-set

 name="имя"

 use-attribute-sets="имена">

 <!--
Содержимое: несколько элементов xsl:attribute -->

</xsl:attribute-set>

Для того чтобы упростить создание в элементах целых наборов атрибутов, можно заранее определить их в элементе

xsl:attribute-set
. Обязательный атрибут
name
задает имя набора атрибутов. Элемент
xsl:attribute-set
содержит последовательность, состоящую из нуля или более элементов
xsl:attribute
.

Именованные наборы атрибутов можно использовать, указывая их имена в значении атрибута

use-attribute-sets
, который может присутствовать в элементах
xsl:element
,
xsl:copy
и
xsl:attribute-set
, а также в литеральных результирующих элементах. В атрибуте
use-attribute-sets
через пробел перечисляются имена наборов атрибутов, которые должны быть использованы в данном элементе.

Включение набора атрибутов в элемент равносильно простому копированию элементов

xsl:attribute
, определенных в соответствующих элементах
xsl:attribute-set
.

Пример

Предположим, что во входящем документе нам нужно вывести структуру, состоящую из элементов с именем

element
, атрибут
name
которых равен имени, атрибут
attr-count
 — количеству атрибутов, а атрибут
node-count
— количеству дочерних узлов соответствующего элемента.

Листинг 7.8. Входящий документ

<a b="1" c="2">

 <d e="3" f="4" g="5"/>

</a>

Листинг 7.9. Преобразование

<xsl:stylesheet

 version="1.0"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output indent="yes"/>

 <xsl:attribute-set name="attrs">

<xsl:attribute name="attr-count">

<xsl:value-of select="count(@*)"/>

</xsl:attribute>

 </xsl:attribute-set>

 <xsl:attribute-set name="elements">

<xsl:attribute name="name">

<xsl:value-of select="name"/>

</xsl:attribute>

<xsl:attribute name="node-count">

<xsl:value-of select="count(*)"/>

</xsl:attribute>

 </xsl:attribute-set>

 <xsl:template match="*">

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