В свою очередь конструкция вида
создаст элемент
что на самом деле эквивалентно просто .
Таким образом, атрибут namespaceнаиболее приоритетен для определения пространства имен создаваемого элемента. Обратимся теперь к случаю, когда этот атрибут опущен в xsl:element. Объявление вида
создаст элемент
Как видим, отсутствие namespaceи namespace=""— не одно и то же.
Рассмотрим теперь случай, когда нет ни атрибута namespace, ни префикса в name:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Результатом этого преобразования будет документ, состоящий из одного пустого элемента html:
Мы специально привели все преобразование целиком, чтобы показать, что выходящий элемент будет принадлежать нулевому пространству имен тогда и только тогда, когда для него не было объявлено пространства имен по умолчанию. Попробуем посмотреть, что получится, если пространство имен по умолчанию будет объявлено:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Результатом в этот раз будет элемент с локальной частью имени " html", принадлежащий пространству имен с URI " http://www.w3.org/1999/xhtml":
Этот элемент задается конструкцией вида:
name="{ имя }"
namespace="{ пространство имен }">
Использование элементов xsl:attributeи xsl:elementво многом аналогично. Обязательный атрибут name указывает имя, а атрибут namespace— URI пространства имен создаваемого атрибута, причем процесс вычисления расширенного имени атрибута практически идентичен этому в процедуре вычисления имени элемента, который был приведен при разборе xsl:element.
Показаний к применению xsl:attributeнесколько больше, чем для xsl:element. В частности, xsl:attributeследует использовать, если:
□ требуется создать атрибут с не известным заранее именем или пространством имен;
□ требуется создать атрибут в пространстве имен, которое является для процессора значащим (например, в пространстве имен XSLT);
□ требуется создать атрибут, вычисление значения которого не может быть реализовано одним или несколькими XPath-выражениями (например, условный вывод атрибута).
Приведем некоторые примеры.
Покажем, как преобразовать структуру вида
в элемент
Для достижения цели воспользуемся следующим преобразованием.
Листинг 7.5. Создание атрибутов при помощи xsl:attribute
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Элемент xsl:attributeне может использоваться где угодно: узлы атрибутов должны создаваться только как дочерние узлы узлов элементов. Более того, узлы атрибутов должны создаваться до создания дочерних узлов других типов — текста, элементов и так далее. Таким образом, xsl:attributeможет быть использован в содержимом любого из следующих родителей:
□ литерального элемента результата;
□ элемента xsl:element;
□ элемента xsl:copyв случае, если текущий, копируемый узел является элементом;
□ элемента xsl:attribute-setв случае определения именованного набора атрибутов.
При этом, как было показано в предыдущем примере, xsl:attributeне обязан использоваться только в качестве их непосредственного дочернего элемента. Главное, чтобы атрибуты создавались в элементах и только в элементах.
Элемент xsl:attributeтакже не может использоваться для генерации объявлений пространств имен. В соответствии с технической рекомендацией XSLT, xsl:attributeне может создавать атрибуты, имена которых имеют префикс xmlns.
Если атрибут создается в элементе, который уже имеет атрибут с таким же именем, старый атрибут будет переопределен новым значением.
Рассмотрим пример.
Листинг 7.6. Фрагмент шаблона
<���а href="http://www.aaa.com">
http://www.bbb.com
Листинг 7.7. Результат
Поскольку атрибут может содержать только текст, результатом выполнения содержимого xsl:attributeтоже должны быть только текстовые узлы. Процессор в лучшем случае проигнорирует нетекстовые узлы, в худшем выведет сообщение об ошибке, прервав дальнейшую обработку, так что следует очень внимательно относиться к содержимому xsl:attribute.
Текстовое значение атрибута может задаваться не только символьными данными, Оно может генерироваться также элементами XSLT, такими, как, например, xsl:textи xsl:value-of. То есть вполне корректным будет следующее определение:
Читать дальше