Kniga-Online.club

Алексей Валиков - Технология XSLT

Читать бесплатно Алексей Валиков - Технология XSLT. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

□ Если в элементе 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:

<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

<xsl:stylesheet

 version="1.0"

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

 <xsl:template match="element">

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

   <xsl:apply-templates select="attribute"/>

  </xsl:element>

 </xsl:template>

 <xsl:template match="attribute">

  <xsl:attribute name="{@name}">

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

  </xsl:attribute>

 </xsl:template>

</xsl:stylesheet>

Элемент xsl:attribute не может использоваться где угодно: узлы атрибутов должны создаваться только как дочерние узлы узлов элементов. Более того, узлы атрибутов должны создаваться до создания дочерних узлов других типов — текста, элементов и так далее. Таким образом, xsl:attribute может быть использован в содержимом любого из следующих родителей:

□ литерального элемента результата;

□ элемента xsl:element;

□ элемента xsl:copy в случае, если текущий, копируемый узел является элементом;

□ элемента xsl:attribute-set в случае определения именованного набора атрибутов.

При этом, как было показано в предыдущем примере, xsl:attribute не обязан использоваться только в качестве их непосредственного дочернего элемента. Главное, чтобы атрибуты создавались в элементах и только в элементах.

Элемент xsl:attribute также не может использоваться для генерации объявлений пространств имен. В соответствии с технической рекомендацией XSLT, xsl:attribute не может создавать атрибуты, имена которых имеют префикс xmlns.

Если атрибут создается в элементе, который уже имеет атрибут с таким же именем, старый атрибут будет переопределен новым значением.

Рассмотрим пример.

Листинг 7.6. Фрагмент шаблона

<а href="http://www.aaa.com">

 <xsl:attribute name="href">

  <xsl:text>http://www.bbb.com</xsl:text>

 </xsl:attribute>

</a>

Листинг 7.7. Результат

<a href="http://www.bbb.com"/>

Поскольку атрибут может содержать только текст, результатом выполнения содержимого xsl:attribute тоже должны быть только текстовые узлы. Процессор в лучшем случае проигнорирует нетекстовые узлы, в худшем выведет сообщение об ошибке, прервав дальнейшую обработку, так что следует очень внимательно относиться к содержимому xsl:attribute.

Текстовое значение атрибута может задаваться не только символьными данными, Оно может генерироваться также элементами XSLT, такими, как, например, xsl:text и xsl:value-of. То есть вполне корректным будет следующее определение:

<xsl:attribute name="href">

 <xsl:text>http://</xsl:text>

 <xsl:value-of select="concat('www', '.', 'bbb')"/>

Перейти на страницу:

Алексей Валиков читать все книги автора по порядку

Алексей Валиков - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Технология XSLT отзывы

Отзывы читателей о книге Технология XSLT, автор: Алексей Валиков. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*