xsl:attribute¶
Элемент xsl:attribute
служит для создания узлов атрибутов в выходном документе.
Синтаксис¶
1 2 3 |
|
Атрибуты:
name
- обязательный атрибут, указывает имя создаваемого атрибута. Может содержать шаблон значения, т. е. имя атрибута может быть вычислено во время выполнения.
namespace
- необязательный атрибут, указывает URI пространства имен создаваемого атрибута. Может содержать шаблон значения, что позволяет вычислять пространство имен создаваемого элемента при помощи выражений.
Описание и примеры¶
Особенности обращения с xsl:attribute
:
- Атрибуты могут создаваться только в узлах элементов. Если атрибут создается в узле, который не является узлом элемента, процессор может либо выдать ошибку, либо проигнорировать создаваемый атрибут.
- Атрибуты могут содержать только текстовые узлы. Процессор может либо выдать ошибку, либо проигнорировать нетекстовые узлы.
- Узлы атрибутов должны быть первыми узлами, которые создаются в элементах. XSLT не разрешает создавать атрибуты после того, как в элемент включены дочерние узлы других типов.
- В случае, когда документ преобразуется в другой XML-документ, символы перевода строки в элементе заменяются символьными сущностями.
Пример 1¶
Покажем, как преобразовать структуру вида:
1 2 3 4 |
|
в элемент <record fieldcount="12" title="Aggregation"/>
.
Для достижения цели воспользуемся следующим преобразованием:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Элемент xsl:attribute
не может использоваться где угодно: узлы атрибутов должны создаваться только как дочерние узлы узлов элементов. Более того, узлы атрибутов должны создаваться до создания дочерних узлов других типов — текста, элементов и так далее. Таким образом, xsl:attribute
может быть использован в содержимом любого из следующих родителей:
- литерального элемента результата;
- элемента
xsl:element
; - элемента
xsl:copy
в случае, если текущий, копируемый узел является элементом; - элемента
xsl:attribute-set
в случае определения именованного набора атрибутов.
При этом, xsl:attribute
не обязан использоваться только в качестве их непосредственного дочернего элемента. Главное, чтобы атрибуты создавались в элементах и только в элементах.
Элемент xsl:attribute
также не может использоваться для генерации объявлений пространств имен. В соответствии с технической рекомендацией XSLT, xsl:attribute
не может создавать атрибуты, имена которых имеют префикс xmlns
.
Если атрибут создается в элементе, который уже имеет атрибут с таким же именем, старый атрибут будет переопределен новым значением.
Пример 2¶
Фрагмент шаблона:
1 2 3 4 5 |
|
Результат: <a href="http://www.bbb.com" />
.
Поскольку атрибут может содержать только текст, результатом выполнения содержимого xsl:attribute
тоже должны быть только текстовые узлы. Процессор в лучшем случае проигнорирует нетекстовые узлы, в худшем выведет сообщение об ошибке, прервав дальнейшую обработку, так что следует очень внимательно относиться к содержимому xsl:attribute
.
Текстовое значение атрибута может задаваться не только символьными данными. Оно может генерироваться также элементами XSLT, такими, как, например, xsl:text
и xsl:value-of
. То есть вполне корректным будет следующее определение:
1 2 3 4 5 |
|
В том случае, если текстовое значение атрибута содержит символы перевода строки, при генерации атрибута они будут заменены сущностями, то есть определение
1 2 3 4 |
|
создаст атрибут с именем href
и значением <code>a&</code><code>#xA;b</code>
:
1 |
|
Техническая рекомендация объясняет такую ситуацию следующим образом: в соответствии со стандартом языка XML, символы перевода строки должны нормализоваться в значениях атрибутов пробелами, сущности же нормализовать не нужно. Но если бы символ перевода строки нормализовался в XSLT при выводе пробелом, то определения:
1 |
|
и
1 |
|
(из-за особенностей парсера пример следует читать без пустого комментария)
были бы эквивалентны, что не отражает реального положения вещей. Для того чтобы исправить эту несуразицу, символ перевода строки при выводе в атрибуте нормализуется в XSLT символьной сущностью.
Пример 3¶
Следующий короткий пример демонстрирует применение новых атрибутов select
и separator
. В таблице стилей диапазонное выражение XPath 2.0 (выражение "to
") используется для присваивания последовательности значений атрибуту example
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Таблица стилей генерирует очень короткий документ:
1 |
|
Благодаря атрибуту XSLT 2.0 separator
вам не придется самостоятельно реализовывать логику следующего вида:
1 2 3 4 5 6 |
|
Пример 4¶
В последнем примере используются схемосовместимые атрибуты <xsl:attribute>
. Наша таблица стилей содержит импортированную схему, определяющую новый тип данных; атрибут <xsl:attribute>
используется для создания атрибутов с этим типом данных. Таблица стилей выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
Таблица стилей используется для обработки следующего документа:
1 2 3 4 5 6 7 8 |
|
Таблица стилей использует оператор XPath castable as
для определения того, может ли значение из исходного документа быть преобразовано в значение zip:zipcode
. Если проверка дает положительный результат, мы создаем новый атрибут с типом данных zip:zipcode
. Результат:
1 2 3 4 5 6 7 |
|
Два атрибута из сгенерированного набора уточняются пространством имен и содержат значения соответствующего типа данных.
Пример 5¶
1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 |
|
См. также¶
xsl:attribute-set
- определяет именованный набор атрибутов.
Ссылки¶
xsl:attribute
MDN (рус.)xsl:attribute
MSDN (en)