<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='element'>
<xsl:element name='{@name}'>
<xsl:apply-templates select='attribute'/>
</xsl:element>
</xsl:template>
<xsl:template match='attribute'>
<xsl:attribute name='{@name}'>
<xsl:value-of select='@value'/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
Элемент xsl:attribute
не может использоваться где угодно: узлы атрибутов должны создаваться только как дочерние узлы узлов элементов. Более того, узлы атрибутов должны создаваться до создания дочерних узлов других типов — текста, элементов и так далее. Таким образом, xsl:attribute
может быть использован в содержимом любого из следующих родителей:
□ литерального элемента результата;
□ элемента xsl:element
;
□ элемента xsl:copy
в случае, если текущий, копируемый узел является элементом;
□ элемента xsl:attribute-set
в случае определения именованного набора атрибутов.
При этом, как было показано в предыдущем примере, xsl:attribute
не обязан использоваться только в качестве их непосредственного дочернего элемента. Главное, чтобы атрибуты создавались в элементах и только в элементах.
Элемент xsl:attribute
также не может использоваться для генерации объявлений пространств имен. В соответствии с технической рекомендацией XSLT, xsl:attribute
не может создавать атрибуты, имена которых имеют префикс xmlns
.
Если атрибут создается в элементе, который уже имеет атрибут с таким же именем, старый атрибут будет переопределен новым значением.
Рассмотрим пример.
<а href='http://www.aaa.com'>
<xsl:attribute name='href'>
<xsl:text>http://www.bbb.com</xsl:text>
</xsl:attribute>
</a>
<a href='http://www.bbb.com'/>
Поскольку атрибут может содержать только текст, результатом выполнения содержимого 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
b
':
<а href='a
b'/>
Техническая рекомендация объясняет такую ситуацию следующим образом: в соответствии со стандартом языка XML, символы перевода строки должны нормализоваться в значениях атрибутов пробелами, сущности же нормализовать не нужно. Но если бы символ перевода строки нормализовался в XSLT при выводе пробелом, то определения
<xsl:attribute name='href'>a□b</xsl:attribute>
и
<xsl:attribute name='href'>a¶
b</xsl:attribute>
были бы эквивалентны, что не отражает реального положения вещей. Для того чтобы исправить эту несуразицу, символ перевода строки при выводе в атрибуте нормализуется в XSLT символьной сущностью (

или
).
Подводя итог, перечислим в краткой форме основные особенности обращения с xsl:attribute
.
□ Атрибуты могут создаваться
□ Атрибуты могут содержать
□ Узлы атрибутов
□ В случае, когда документ преобразуется в другой XML-документ, символы перевода строки в элементе заменяются символьными сущностями.
Именованные наборы атрибутов
Элемент
Синтаксис элемента определяется следующей конструкцией:
<xsl:attribute-set
name='
use-attribute-sets='