<!-- Содержимое: несколько элементов 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 — количеству дочерних узлов соответствующего элемента.
<a b='1' c='2'>
<d e='3' f='4' g='5'/>
</a>
<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='*'>
<xsl:element name='element'
use-attribute-sets='elements attrs'>
<xsl:apply-templates select='*'/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
<?xml version='1.0' encoding='utf-8'?>
<element name='a' node-count='1' attr-count='2'>
<element name='d' node-count='0' attr-count='3'/>
</element>
В этом преобразовании определение элемента
<xsl:element name='element'
use-attribute-sets='elements attrs'>
<xsl:apply-templates select='*'/>
</xsl:element>
равносильно определению
<xsl:element name='element'>
<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 name='attr-count'>
<xsl:value-of select='count(@*)'/>
</xsl:attribute>
<xsl:apply-templates select='*'/>
</xsl:element>
Как уже было сказано, элемент xsl:attribute-set может также использовать другие наборы атрибутов при помощи use-attribute-sets. Например, в предыдущем преобразовании набор атрибутов elements мог быть определен как:
<xsl:attribute-set name='elements'
use-attribute-sets='attrs'>
<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>
Тогда для достижения того же результата элемент с именем element мог быть создан с использованием только одного набора атрибутов:
<xsl:element name='element'
use-attribute-sets='elements'>
<xsl:apply-templates select='*'/>
</xsl:element>
Именованный набор атрибутов не может прямо или косвенно (посредством других наборов атрибутов) использовать в значении use-attribute-sets себя самого. Такая ситуация породила бы бесконечный цикл. Вообще, не рекомендуется выстраивать сложную иерархию именованных наборов атрибутов, поскольку это может сильно усложнить обработку и снизить эффективность преобразования, хотя, естественно, все зависит от конкретного случая.
