Книга: Технология XSLT
Создание узлов атрибутов
Разделы на этой странице:
Элемент xsl:attribute
Этот элемент задается конструкцией вида:
<xsl:attribute
name="{имя}"
namespace="{пространство имен}">
<!-- Содержимое: шаблон -->
</xsl:attribute>
Использование элементов xsl:attribute
и xsl:element
во многом аналогично. Обязательный атрибут name указывает имя, а атрибут namespace
— URI пространства имен создаваемого атрибута, причем процесс вычисления расширенного имени атрибута практически идентичен этому в процедуре вычисления имени элемента, который был приведен при разборе xsl:element
.
Показаний к применению xsl:attribute
несколько больше, чем для xsl:element
. В частности, xsl:attribute
следует использовать, если:
? требуется создать атрибут с не известным заранее именем или пространством имен;
? требуется создать атрибут в пространстве имен, которое является для процессора значащим (например, в пространстве имен XSLT);
? требуется создать атрибут, вычисление значения которого не может быть реализовано одним или несколькими XPath-выражениями (например, условный вывод атрибута).
Приведем некоторые примеры.
Покажем, как преобразовать структуру вида
<element name="record">
<attribute name="fieldcount" value="12"/>
<attribute name="title" value="Aggregation"/>
</element>
в элемент
<record fieldcount="12" title="Aggregation"/>
Для достижения цели воспользуемся следующим преобразованием.
Листинг 7.5. Создание атрибутов при помощи xsl:attribute
<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
.
Если атрибут создается в элементе, который уже имеет атрибут с таким же именем, старый атрибут будет переопределен новым значением.
Рассмотрим пример.
Листинг 7.6. Фрагмент шаблона
<а href="https://gsb.wm-domains.ru/lookup.php?site=http%3A%2F%2Fwww.aaa.com">
<xsl:attribute name="href">
<xsl:text>http://www.bbb.com</xsl:text>
</xsl:attribute>
</a>
Листинг 7.7. Результат
<a href="https://gsb.wm-domains.ru/lookup.php?site=http%3A%2F%2Fwww.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
.
? Атрибуты могут создаваться только в узлах элементов. Если атрибут создается в узле, который не является узлом элемента, процессор может либо выдать ошибку, либо проигнорировать создаваемый атрибут.
? Атрибуты могут содержать только текстовые узлы. Процессор может либо выдать ошибку, либо проигнорировать нетекстовые узлы.
? Узлы атрибутов должны быть первыми узлами, которые создаются в элементах. XSLT не разрешает создавать атрибуты после того, как в элемент включены дочерние узлы других типов.
? В случае, когда документ преобразуется в другой XML-документ, символы перевода строки в элементе заменяются символьными сущностями.
- Глава 3 Создание и применение шаблонов
- Создание узлов элементов
- Сводная таблица характеристик узлов
- Перечисление узлов
- Написание значений атрибутов
- Создание образцов выбора
- Шаблоны значений атрибутов
- Обработка дочерних узлов
- Создание файлов с блокировкой
- Создание свободно позиционируемых элементов
- 12. Лекция: Создание приложений с графическим интерфейсом пользователя.
- Создание объектов Collection