<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'/>
Для достижения цели воспользуемся следующим преобразованием.
