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

Скачивание начинается... Если скачивание не началось автоматически, пожалуйста нажмите на эту ссылку.
Жалоба
Напишите нам, и мы в срочном порядке примем меры.
Описание книги "Технология XSLT"
Описание и краткое содержание "Технология XSLT" читать бесплатно онлайн.
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
□ Если в элементе 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')"/>
Подписывайтесь на наши страницы в социальных сетях.
Будьте в курсе последних книжных новинок, комментируйте, обсуждайте. Мы ждём Вас!
Похожие книги на "Технология XSLT"
Книги похожие на "Технология XSLT" читать онлайн или скачать бесплатно полные версии.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Отзывы о "Алексей Валиков - Технология XSLT"
Отзывы читателей о книге "Технология XSLT", комментарии и мнения людей о произведении.