<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<xsl:element
name='xsl:html'
namespace='http://www.w3.org/1999/xhtml'/>
</xsl:template>
</xsl:stylesheet>
В выделенном элементе xsl:element
пространство имен создаваемого элемента указано вроде бы два раза: в виде значения атрибута namespace
и в виде префикса имени ('xsl
'). Результат будет выглядеть следующим образом:
<xsl:html xmlns:xsl='http://www.w3.org/1999/xhtml'/>
Процессор использовал пространство имен, указанное в атрибуте namespace
, локальную часть имени, заданного атрибутом name ('html
'), а также префикс (только префикс, но не связанное с ним пространство имен) этого имени ('xsl
').
В свою очередь конструкция вида
<xsl:element name='xsl:html' namespace=''/>
создаст элемент
<xsl:html xmlns:xsl=''></xsl:html>
что на самом деле эквивалентно просто <html/>
.
Таким образом, атрибут namespace
наиболее приоритетен для определения пространства имен создаваемого элемента. Обратимся теперь к случаю, когда этот атрибут опущен в xsl:element
. Объявление вида
<xsl:element name='xsl:html'/>
создаст элемент
<xsl:html xmlns:xsl='http://www.w3.org/1999/XSL/Transform'/>
Как видим, отсутствие namespace
и namespace=''
— не одно и то же.
Рассмотрим теперь случай, когда нет ни атрибута namespace
, ни префикса в name
:
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<xsl:element name='html'/>
</xsl:template>
</xsl:stylesheet>
Результатом этого преобразования будет документ, состоящий из одного пустого элемента html
:
<html/>
Мы специально привели все преобразование целиком, чтобы показать, что выходящий элемент будет принадлежать нулевому пространству имен тогда и только тогда, когда для него не было объявлено пространства имен по умолчанию. Попробуем посмотреть, что получится, если пространство имен по умолчанию будет объявлено:
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/' xmlns='http://www.w3.org/1999/xhtml'>
<xsl:element name='html'/>
</xsl:template>
</xsl:stylesheet>
Результатом в этот раз будет элемент с локальной частью имени 'html
', принадлежащий пространству имен с URI 'http://www.w3.org/1999/xhtml
':
<html xmlns='http://www.w3.org/1999/xhtml' />
Создание узлов атрибутов
Элемент
Этот элемент задается конструкцией вида:
<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'/>
Для достижения цели воспользуемся следующим преобразованием.