Вход/Регистрация
Технология XSLT
вернуться

Валиков Алексей Н.

Шрифт:

Представим теперь, что нам в XSLT-преобразовании необходимо сгенерировать другое XSLT-преобразование. Скажем из элемента вида

<remove element="a"/>

нужно получить шаблон

<xsl:template match="a"/>

Беда в том, что литеральные элементы не могут быть использованы для создания, скажем, элемента

xsl:template
по той причине, что любой элемент с локальной частью имени
template
, принадлежащий пространству имен XSLT будет рассматриваться процессором, как элемент самого преобразования. Очевидно, что

<xsl:template match="remove">

 <xsl:template match="{@element}"/>

</xsl:template>

будет некорректным определением. He поможет и смена префикса, ведь принадлежность пространству имен определяется не им.

Для того чтобы решить эти проблемы (главным образом, первую), XSLT предоставляет возможность создавать узлы элементов при помощи элемента

xsl:element
.

Элемент xsl:element

Синтаксическая конструкция этого элемента задается следующим образом:

<xsl:element

 name="{имя}"

 namespace="{пространство имен}

 "use-attribute-sets="имена">

 <!-- Содержимое: шаблон -->

</xsl:element>

Здесь обязательный атрибут

name
указывает имя создаваемого элемента. Этот атрибут может содержать шаблон значения, а значит, имя элемента может быть вычислено во время выполнения.

Атрибут

namespace
указывает URI пространства имен создаваемого элемента. Точно так же, как и name, этот атрибут может содержать шаблон значения, что позволяет вычислять пространство имен создаваемого элемента при помощи выражений.

Атрибут

use-attribute-sets
перечисляет имена наборов атрибутов, которые должны быть включены в создаваемый элемент.

Содержимым

xsl:element
является шаблон, который выполняется процессором и затем включается в создаваемый элемент.

Пример

Предположим, мы хотим поменять имя каждого элемента на значение его первого атрибута и наоборот.

Листинг 7.1. Входящий документ

<fire on="babylon"/>

Листинг 7.2. Шаблон, заменяющий имя элемента значением атрибута

<xsl:template match="*">

 <xsl:element name="{@*}">

<xsl:attribute name="{name(@*)}">

<xsl:value-of select="name"/>

</xsl:attribute>

 </xsl:element>

</xsl:template>

Листинг 7.3. Выходящий документ

<babylon on="fire"/>

В этом примере код

<xsl:element name="{@*}">...</xsl:element>
создает элемент, именем которого становится значение выражения
@*
, указанного в виде шаблона значения атрибута
name
. Это выражение выбирает множество, состоящее из узлов атрибутов текущего элемента, а если привести его к строке, в результате получится текстовое значение первого атрибута элемента.

Подобным образом выбирается имя атрибута создаваемого элемента и его значение.

Вычисленное значение атрибута

name
может задавать и расширенное имя элемента, то есть иметь форму
префикс:имя
. В этом случае элемент будет создаваться в том пространстве имен, которое соответствует указанному префиксу, например

<xsl:element name="xsl:template"/>

создаст элемент вида

<xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>

Заметим, что элемент вида

<xsl:element name="{concat{'xsl',':','template')}"/>

даст тот же результат.

Другим способом указания пространства имен при использовании элемента

xsl:element
является использование атрибута
namespace
. Например, для предыдущего случая мы могли бы записать

<xsl:element

 name="template"

 namespace="http://www.w3.org/1999/XSL/Transform"/>

  • Читать дальше
  • 1
  • ...
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: