том случае, если текстовое значение атрибута содержит символы перевода строки, при генерации атрибута они будут заменены сущностями, то есть определение
<xsl:attribute name="href">а¶
b</xsl:attribute>
создаст атрибут с именем "
href
" и значением "
a
b
":
<а href="#"/>
Техническая рекомендация объясняет такую ситуацию следующим образом: в соответствии со стандартом языка XML, символы перевода строки должны нормализоваться в значениях атрибутов пробелами, сущности же нормализовать не нужно. Но если бы символ перевода строки нормализовался в XSLT при выводе пробелом, то определения
<xsl:attribute name="href">a□b</xsl:attribute>
и
<xsl:attribute name="href">a¶
b</xsl:attribute>
были бы эквивалентны, что не отражает реального положения вещей. Для того чтобы исправить эту несуразицу, символ перевода строки при выводе в атрибуте нормализуется в XSLT символьной сущностью (


или
).
Подводя итог, перечислим в краткой форме основные особенности обращения с
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
— количеству дочерних узлов соответствующего элемента.