Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Предположим, мы хотим поменять имя каждого элемента на значение его первого атрибута и наоборот.
В этом примере код ...
создает элемент, именем которого становится значение выражения @*
, указанного в виде шаблона значения атрибута 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
имеет наивысший приоритет при определении пространства имен выходящего элемента. Рассмотрим следующее преобразование.
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
").
В свою очередь конструкция вида
создаст элемент
что на самом деле эквивалентно просто .
Таким образом, атрибут namespace
наиболее приоритетен для определения пространства имен создаваемого элемента. Обратимся теперь к случаю, когда этот атрибут опущен в xsl:element
. Объявление вида
создаст элемент
Как видим, отсутствие namespace
и namespace=""
— не одно и то же.
Рассмотрим теперь случай, когда нет ни атрибута namespace
, ни префикса в name
:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Результатом этого преобразования будет документ, состоящий из одного пустого элемента html
:
Мы специально привели все преобразование целиком, чтобы показать, что выходящий элемент будет принадлежать нулевому пространству имен тогда и только тогда, когда для него не было объявлено пространства имен по умолчанию. Попробуем посмотреть, что получится, если пространство имен по умолчанию будет объявлено:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Результатом в этот раз будет элемент с локальной частью имени " html
", принадлежащий пространству имен с URI " http://www.w3.org/1999/xhtml
":
Создание узлов атрибутов
Элемент xsl:attribute
Этот элемент задается конструкцией вида:
name="{ имя }"
namespace="{ пространство имен }">
Использование элементов xsl:attribute
и xsl:element
во многом аналогично. Обязательный атрибут name указывает имя, а атрибут namespace
— URI пространства имен создаваемого атрибута, причем процесс вычисления расширенного имени атрибута практически идентичен этому в процедуре вычисления имени элемента, который был приведен при разборе xsl:element
.
Показаний к применению xsl:attribute
несколько больше, чем для xsl:element
. В частности, xsl:attribute
следует использовать, если:
□ требуется создать атрибут с не известным заранее именем или пространством имен;
□ требуется создать атрибут в пространстве имен, которое является для процессора значащим (например, в пространстве имен XSLT);
□ требуется создать атрибут, вычисление значения которого не может быть реализовано одним или несколькими XPath-выражениями (например, условный вывод атрибута).
Приведем некоторые примеры.
Покажем, как преобразовать структуру вида
в элемент
Для достижения цели воспользуемся следующим преобразованием.
version="1.0"
Интервал:
Закладка: