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

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

Шрифт:

и получить в итоге

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

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

Атрибут

namespace
тоже может быть сконструирован на этапе выполнения, например:

<xsl:element

 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.

<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
:

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

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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