Атрибут namespaceуказывает URI пространства имен создаваемого элемента. Точно так же, как и name, этот атрибут может содержать шаблон значения, что позволяет вычислять пространство имен создаваемого элемента при помощи выражений.
Атрибут use-attribute-setsперечисляет имена наборов атрибутов, которые должны быть включены в создаваемый элемент.
Содержимым xsl:elementявляется шаблон, который выполняется процессором и затем включается в создаваемый элемент.
Пример
Предположим, мы хотим поменять имя каждого элемента на значение его первого атрибута и наоборот.
Листинг 7.1. Входящий документ
Листинг 7.2. Шаблон, заменяющий имя элемента значением атрибута
Листинг 7.3. Выходящий документ
В этом примере код ...создает элемент, именем которого становится значение выражения @*, указанного в виде шаблона значения атрибута name. Это выражение выбирает множество, состоящее из узлов атрибутов текущего элемента, а если привести его к строке, в результате получится текстовое значение первого атрибута элемента.
Подобным образом выбирается имя атрибута создаваемого элемента и его значение.
Вычисленное значение атрибута nameможет задавать и расширенное имя элемента, то есть иметь форму префикс : имя . В этом случае элемент будет создаваться в том пространстве имен, которое соответствует указанному префиксу, например
создаст элемент вида
Заметим, что элемент вида
даст тот же результат.
Другим способом указания пространства имен при использовании элемента xsl:elementявляется использование атрибута namespace. Например, для предыдущего случая мы могли бы записать
name="template"
namespace="http://www.w3.org/1999/XSL/Transform"/>
и получить в итоге
что эквивалентно результату предыдущего примера, хоть и различается внешне.
Атрибут namespaceтоже может быть сконструирован на этапе выполнения, например:
name="template"
namespace="{concat('http://www.w3.org/', 2001 - 2, '/XSL/Transform')}"/>
что также даст элемент template, принадлежащий пространству имен XSLT.
Для того чтобы разобраться в приоритетах атрибутов nameи namespaceна определение пространства имен, приведем несколько правил, которые пояснят этот процесс.
□ Если в элементе xsl:elementопределен атрибут namespace, то создаваемый элемент будет принадлежать пространству имен с URI, который будет значением этого атрибута. Если значением атрибута namespaceбудет пустая строка, создаваемый элемент будет принадлежать нулевому пространству имен. Как правило, процессоры используют префикс, указанный в имени атрибутом name, но, вместе с тем, они не обязаны так делать. Поэтому в общем случае следует ожидать, что префикс может быть любым.
□ Если в элементе xsl:elementне определен атрибут namespace, но имя, заданное в атрибуте name имеет префикс, то создаваемый элемент будет принадлежать соответствующему этому префиксу пространству имен. Однако и в этом случае не гарантируется, что префикс создаваемого элемента будет таким, каким он был задан в атрибуте name.
□ В случае, если в элементе xsl:elementне определен атрибут namespaceи имя, заданное в атрибуте name не имеет префикса, создаваемый элемент будет принадлежать пространству имен, которое действует для создающего элемента xsl:elementпо умолчанию.
Повторим еще раз, что во всех трех случаях сказать что-либо достоверно о префиксе создаваемого элемента нельзя — префикс с точки зрения пространств имен не является значащей частью имени элемента. Вместе с тем, на практике процессоры, как правило, используют префикс, указанный в атрибуте name, или не используют префикс вообще, если префикс в nameуказан не был.
Приведем несколько примеров.
Для начала покажем, что, согласно первому правилу, атрибут namespaceимеет наивысший приоритет при определении пространства имен выходящего элемента. Рассмотрим следующее преобразование.
Листинг 7.4.
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
name="xsl:html"
namespace="http://www.w3.org/1999/xhtml"/>
В выделенном элементе xsl:elementпространство имен создаваемого элемента указано вроде бы два раза: в виде значения атрибута namespaceи в виде префикса имени (" xsl"). Результат будет выглядеть следующим образом:
Процессор использовал пространство имен, указанное в атрибуте namespace, локальную часть имени, заданного атрибутом name (" html"), а также префикс (только префикс, но не связанное с ним пространство имен) этого имени (" xsl").
Читать дальше