<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

Этот элемент задается конструкцией вида:

<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
Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату