Алексей Валиков - Технология XSLT
- Название:Технология XSLT
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2002
- Город:Санкт-Петербург
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Алексей Валиков - Технология XSLT краткое содержание
Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.
Для начинающих и профессиональных программистов
Технология XSLT - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Эта проблема решается в XSLT просто и элегантно. Атрибут mode
элемента xsl:template задает режим этого шаблона. Точно такой же атрибут есть у элемента xsl:apply-templates
: в этом элементе он устанавливает режим обработки . При выполнении xsl:apply-templates
процессор будет применять только те шаблоны преобразования, режим которых совпадает с выбранным режимом обработки.
В качестве примера приведем преобразование, которое добавляет в XHTML-файл перечень текстовых ссылок, обнаруженных в этом документе. Грубо говоря, XHTML — это XML-версия языка HTML, а значит XSLT вполне подходит для обработки XHTML-документов.
URI пространства имен языка XHTML — "http://www.w3.org/1999/xhtml"
; этому языку мы назначим префикс " xhtml
" и, кроме того, сделаем это пространство пространством имен по умолчанию:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml">
...
Начнем с шаблона, который будет выводить каждую из ссылок. В каждой ссылке мы будем выводить только ее атрибут href
и текст, который она содержит. Для удобочитаемости мы также добавим элемент br
и символ переноса строки .
Мы чуть позже познакомимся с элементами xsl:copy
, xsl:copy-of
и xsl:text
, пока же скажем, что
копирует в выходящий документ текущий узел, его атрибут href
( @href
) и дочерние текстовые узлы ( text()
).
Элемент выводит символ переноса строки. Элемент
является литеральным элементом результата — он никак не обрабатывается, а просто выводится в результирующий документ.
Следующее преобразование называется идентичным преобразованием — оно просто копирует все узлы один в один:
И, наконец, нам понадобится преобразование для элемента body
— в него мы включим копию содержимого, а также ссылки, отсортированные в алфавитном порядке:
Links found on this page:
select=".//xhtml:a[@href and not(xhtml:*)]">
Если мы попытаемся выполнить преобразование, состоящее из этих шаблонов, мы обнаружим, что в тексте самого документа ссылки испортились — там тоже добавились элементы br
и переносы строк. Это произошло потому, что шаблон для обработки ссылок имеет больший приоритет, чем шаблон, копирующий содержимое документа.
Для исправления этой ошибки мы выделим шаблон обработки ссылок в отдельный режим links
:
...
Теперь это правило не будет применяться к ссылкам во время копирования содержимого документа, потому что при выполнении инструкции
режим будет пустым, значит шаблон для xhtml:а
вызываться не будет. Для того чтобы применить его при помощи xsl:apply-templates
, мы добавим в этот элемент атрибут mode
:
select=".//xhtml:a[@href and not(xhtml:*)]"
mode="links">
Разберем более подробно это определение. Данная инструкция будет применять шаблоны с режимом links
к узлам, возвращаемым выражением ".//xhtml:a[@href and not (xhtml:*)]"
, отсортированным в алфавитном порядке своих строковых значений. Выражение ".//xhtml:a[@href and not(xhtml:*)]"
возвращает всех потомков текущего узла (путь выборки " .//
"), которые принадлежат пространству имен xhtml
, являются элементами с именами а
, (тест имени " xhtml:a
"), при этом имеют атрибут href
и не включают в себя другие элементы (предикат " [@href and not (xhtml:*)]
").
Преобразование целиком будет иметь следующий вид.
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml">
Links found on this page:
Применив это преобразование, например, к главной странице Консорциума W3 ( http://www.w3.org), мы получим ее точный дубликат, в конце которого будет приведен перечень всех найденных текстовых ссылок. Выходящий документ будет заканчиваться фрагментом вида:
Links found on this page:
About W3C
Accessibility
Activities
и так далее.
Заметим, что того же эффекта можно было добиться другими способами, например, при помощи именованных шаблонов или элемента xsl:for-each
, однако применение режимов, пожалуй, является наиболее гибкой техникой.
Досадным ограничением режимов является то, что режим нельзя выбирать динамически. Атрибут mode
обязан иметь фиксированное значение, то есть вызов вида:
будет некорректным. Особо серьезных практических противопоказаний для динамических режимов нет, будем надеяться, что в следующих версиях XSLT они появятся.
Именованные шаблоны
Вместо того чтобы при помощи атрибута match
указывать, какая часть входящего документа должна преобразовываться данным шаблоном, ему можно присвоить имя и вызывать в любой момент вне зависимости от контекста преобразования. Такие шаблоны очень схожи по принципу с процедурами в императивных языках программирования — они позволяют выносить часто используемые части преобразований, передавать им параметры и вызывать вне зависимости от того, что именно обрабатывается в данный момент.
Имя шаблонному правилу присваивается атрибутом name элемента xsl:template
. После этого шаблону более необязательно иметь атрибут match
, теперь он может быть вызван просто по имени. Два шаблона с одним порядком импорта не могут иметь одинаковых имен. Если же одинаковые имена имеют шаблоны различного порядка импорта, шаблоны старшего порядка переопределяют младшие шаблоны
При генерации HTML-страниц часто встречающейся задачей является создание элемента head
. Элемент head
, как правило, содержит несколько элементов meta
, предоставляющих метаинформацию, элемент title
, который определяет название страницы и элемент link
, который связывает данную страницу с другими документами, например, с каскадными таблицами стилей (CSS).
Для того чтобы упростить процедуру генерации head
, мы можем вынести ее в отдельный именованный шаблон.
content="This site is dedicated to XSLT and Xpath."/>
Думается, этот шаблон не требует пояснений — он просто создает в входящем документе несколько элементов. Непонятным пока остается другое — как вызывать именованные шаблоны? Элемент xsl:apply-templates
явно не подходит, поскольку именованные шаблоны не обязаны иметь атрибут match
. Их выполнение производится элементом xsl:call-template
.
Элемент xsl:call-template
Приведем синтаксис этого элемента:
name=" имя ">
Обязательный атрибут name указывает имя шаблона, который вызывается этой инструкцией. Например, шаблон с именем " head
", приведенный выше, может быть вызван следующим образом:
Интервал:
Закладка: