XSLT |
В данном руководстве рассматривается технология XSLT на простом примере.
В качестве платформы для разработки используется J2SE 1.5.
Дата создания: 08.03.07. |
|||||||||||||||||||||||||||||||||
Cодержание1 Краткое описание технологии XSLT1.1 ВведениеXSLT (Extensible Stylesheet Language Transformation) – язык для описания процедуры преобразования XML-документов в документы другого вида: XML, HTML и текстовый. Схему преобразования документов можно представить так: ![]() Однако исходный документ можно преобразовать и в другой, формат, отличный от трех приведенных. Для этого нужно использовать технологию XSL-FO (XSL Formatting Objects) и специальные преобразователи для нужных форматов. При этом схема преобразования будет выглядеть примерно так: ![]() XLST-описание выполняется с использованием технологии XML. Таким образом XSLT, также как и язык схем, является XML-языком. Идентификатор пространства имен для этого языка: http://www.w3.org/1999/XSL/Transform (принято использовать префикс xsl:). Корневым элементом XSLT документа является элемент stylesheet, внутри которого можно использовать следующие дочерние элементы (top-level element):
Эти элементы в теле stylesheet могут располагаться в любом порядке. Кроме того, он может содержать элементы из другого пространства имен (не XSLT) при условии, что полное имя этих элементов содержит идентификатор пространства имен, отличный от null. Элемент stylesheet имеет обязательный атрибут version, для которого определено значение 1.0. Элементы, используемые в XSLT документах, но не относящиеся к языку XSLT, зачастую используются для формирования структуры выходного XML или HTML документа, а также внедрения документации. Элемент include используется для блочного конструирования XSLT документов путем включения одного XSLT документа в состав другого. URI включаемого документа задается атрибутом href. Включение работает на уровне структуры XML-документа, содержащего XSLT описание. При включении в тело включающего документа помещаются дочерние элементы; они замещают элемент include и не влияют на порядок обработки правил преобразования XSLT. Запрещается прямо или косвенно включать самого себя. Элемент import реализует механизм импорта XSLT документов, который отличается от механизма включения тем, что включенные правила преобразования имеют меньший приоритет, чем правила, содержащиеся в импортирующем документе. URI импортируемого документа указывается атрибутом href. Элементы import, если они используются, должны идти первыми. Технология XSLT использует модель документа и язык выражений, определенный спецификацией XPath с очень небольшими поправками: базовая библиотека функций языка XPath расширена некоторым набором функций, специфичных для XSLT. Элемент output позволяет указать в каком формате будет осуществляться вывод результата XSLT преобразования. XSLT преобразование определяется как преобразование исходного XML-документа в другой XML-документ. Так как XSLT оперирует древовидной моделью документа, то исходный XML-документ часто называют Source XML Tree, а результат преобразования – Result XML Tree. При этом результат преобразования может быть выведен и в не XML виде. В XSLT существует три метода вывода: xml, html, text. Соответственно метод вывода задается атрибутом method элемента output. Можно указать одно из трех значений и другие значения, не определенные спецификацией. В этом случае значение атрибута method будет специфично для XML-процессоров. При отсутствии элемента output метод вывода определяется следующим образом: если результат преобразования имеет единственный дочерний элемент корневого узла, его локальное имя html, а идентификатор пространства имен – null, то метод вывод – html, иначе – XML. Остальные атрибуты элемента output задают параметры вывода:
Технология XSLT широко использует язык XPath, так что вам нужно будет изучить его самостоятельно, обратившись, например, к его спецификации. 1.2 Описание шаблоновОписания шаблонов выполняется элементами template. Узел или множество узлов, к которым применяется шаблон, указывается атрибутом match, значение которого – Xpath выражение. Шаблону может быть назначено имя атрибутом name, что позволяет вызывать его из других шаблонов. В теле шаблона содержится инструкция. Основные инструкции оформляются элементами. Apply-templates позволяет применить шаблоны к дочерним элементам тех элементов, к которым применим данный шаблон. Ограничить множество дочерних узлов можно атрибутом select. Существует группа инструкций для создания элементов, атрибутов и текстовых узлов результирующего дерева. Элементы создаются инструкцией element. Атрибут name (обязательный) – квалифицированное имя, namespace – идентификатор пространства имен, use-attribute-sets – список имен групп атрибутов. Атрибуты создаются инструкцией attribute. Name – обязательный атрибут, namespace – идентификатор пространства имен. Текстовые узлы создаются инструкцией text с атрибутом disable-output-escaping. Значение по умолчанию – no. Если указано yes, то происходит обработка esc-последовательностей. Например, «<» не выполняется, то есть для данного примера в результате преобразования будет помещен текстовый узел с содержимым не «<», а с «<». В теле инструкций element и attribute указывается шаблон, а в теле инструкции text - содержимое создаваемого текстового узла. Инструкции element и attribute используются для создания вычисляемых узлов, то есть узлов, имена которых могут определяться выражением. Инструкции обработки создаются инструкцией processing-instruction. Атрибут name – имя, атрибут comment – комментарии. Именованные группы атрибутов, которые можно использовать при создании элементов, создаются с помощью top-level-element, attribute-set (обязательный элемент), name – имя. В теле указывается инструкция attribute. Генерировать текст выходного документа, обращаясь к элементам и атрибутам входного и используя переменные, можно с помощью инструкции value-of. Атрибут select (обязательный) указывает XPath выражение, результат вычисления которого преобразуется в строку по правилам функции String и на ее основе создается новый текстовый узел. Атрибут disable-output-escaping позволяет отключить обработку esc-последовательностей. Инструкция number позволяет форматировать числа, которые будут включены в выходной документ. Атрибут value задает XPath выражение, результат вычисления которого преобразуется в число по правилам функции number, которое затем округляется до целого и преобразуется в строку на основе остальных атрибутов функции number. Результат преобразования приводит к созданию нового текстового узла. Если этот атрибут не указан, в качестве исходного значения используется позиция текущего узла. При этом учитываются следующие атрибуты:
Существует группа инструкций для управления генерацией вывода, такие, как циклы и ветвление. Для описания циклов используется for-each. Атрибут select указывает множество узлов для циклической обработки в виде XPath выражения. Для ветвления используется пара инструкций:
Sort – для сортировки. Ее можно использовать как дочерний элемент в теле инструкции apply-templates и for-each. Выполняет сортировку узлов, к которым применяются инструкции, совместно с которыми она используется. Атрибут order указывает порядок сортировки. Значения: ascending, descending. Data-type – тип данных: text, number, можно указать и другие значения в виде квалифицированного имени, которое поддерживается данной реализацией XSLT процессора. Case-order – используется, если data-type = text. Указывает, какие символы имеют первоочередной порядок: а или А. Значение по умолчанию определяется атрибутом lang, в котором задается язык сортируемого текста, если не указать, то его значение определяется из системных настроек. Select – задает выражения, которые вычисляются для каждого обрабатываемого узла, результат вычисления преобразуется в строку по правилам функции string и полученное значение используется как ключ сортировки. Default - . , то есть ключ сортировки – строковое значение узла. 1.3 Переменные и параметрыПеременные позволяют связать имя с некоторым значением и затем использовать его в выражении. Для этой же цели существуют и параметры. Различие в том, что значение, связанное с параметром – это значение по умолчанию для параметра, используемого при вызове шаблона. Переменные могут использоваться как top-level-elements и как инструкции. Описываются элементом variable. Параметры описываются элементами param и могут выступать лишь как top-level-elements, имена элементов параметра задаются атрибутом name, значение – атрибутом select в виде XPath выражения. Вызов шаблона, при котором можно использовать параметры, описывается инструкцией call-template. Имя шаблона – атрибут name (обязательный). Параметры указываются инструкцией with-param в теле инструкции call-template. Имя параметра задается атрибутом name (обязательный), а значение – select (Xpath выражение). Параметры в выражениях можно использовать в виде $имя_параметра. Пример шаблона: 1.4 ФункцииSystem-property – возвращает значение системного свойства, имя которого указывается в виде квалифицированного имени в качестве параметра. Имена системных свойств: xsl:version – возвращает версию; xsl:vendor – возвращает название компании XSLT производителя; xsl:vendor-url – возвращает ссылку на его сайт. Generate-id – генерирует строку, которая уникальным образом идентифицирует узел, который в множестве узлов, переданном как параметр, идет первым в документе. Format-number – преобразует в строку число, указанное первым параметром, в соответствии с форматом, указанным вторым параметром, и с использованием именованного формата (третий параметр), который необязателен. Если же он все же указан, он должен соответствовать именованному формату, описанному элементом decimal-format, который является top-level-element. Формат, указанный вторым аргументом, описывается в том же синтаксисе, который используется классом DecimalFormat из пакета java.text. Имя указывается атрибутом name. Атрибут decimal-separator указывает символ десятичного разделителя (default (.)), grouping-separator – символ разделителя групп (,), zero-digit(0) – символ нуля, infinity (Infinity) – для представления бесконечности, NaN (NaN) – not a number, minus-sign (-) – для представления «-». Влияют на интерпретацию форматной строки: digit (#) – указывает символ, который обозначает цифру; pattern-separator (;) – указывает символ, который обозначает символ-разделитель для «+» и «-» частей формата строки. Эти атрибуты соответствуют get/set методам класса DecimalFormatSymbols. 2 Пример XSLT-описания2.1 Описание предметной областиПредметная область будет все та же - компьютерный магазин. Её описание можно найти тут. 2.2 XSLT-описаниеРассмотрим XSLT-описание, формирующее HTML-представление XML-документа. Полученный HTML-документ содержит информацию о проданных компьютерах сотрудниками магазина. При этом для каждого сотрудника выводится таблица, содержащая информацию о проданных им компьютерах, цену и дату продажи. В подвале таблицы указана сумма, на которую были проданы данным сотрудником компьютеры. XSLT-преобразование содержит указание метода вывода - HTML: В XSLT-описании используются именованные параметризованные шаблоны (данный шаблон выводит ссылку на электронный адрес сотрудника): Для реализации ветвления и цикла используются следующие конструкции: Нумерация сотрудников и сортировка компьютеров по цене: Сотрудник № Для форматирования вывода числовой информации используется следующая конструкция: Для подсчета суммы проданных сотрудником компьютеров используется рекурсивный вызов параметризованного шаблона: Полный исходный код XSLT-преобразования: Контакты магазина:Сотрудник №
ФИО:
Должность: Возраст: Контакты: Список проданных компьютеров:
Теперь о том, как проверить работоспособность этого примера. Для этого вам понадобится (все нижеперечисленные файлы должны находится в одном каталоге):
Теперь вы можете посмотреть результат преобразования (если ваш веб-браузер поддерживает XSLT), открыв XML-документ с тестовыми данными, который содержит ссылку на XSLT-описание. 3 Программное XSLT-преобразование3.1 Основные APIДля программной трансформации я использую классы из пакета javax.xml.transform JDK 1.5. Трансформация осуществляется объектом типа Transformer, который создается на фабрике TransformerFactory вызовом метода newTransformer, которому, в качестве параметра, указывается источник XSL-документа. Существует также перегруженная версия метода, без параметров, которая не выполняет трансформации. Для представления источника и результата, используются объекты типа Source и Result. При этом Source и Result – это интерфейсы из пакета javax.xml.transform, для которых предусмотрено три стандартных реализации:
Источник, из которого считывается документ, указывается в элементе Source. Реализация DOM позволяет представить источник и приемник в виде деревьев. При создании экземпляров DOMSource можно указать вершину дерева. DOMResult – результат преобразования в виде дерева, из которого можно получить корневой узел. Реализация SAX формирует источник и приемник с использованием SAX-анализатора. При этом возможно связать с объектом типа SAXSource экземпляр XMLReader. При создании SAXSource источник документа можно указать InputSource. Либо при создании SAXResult, либо при помощи метода setContentHandler можно указать объект обработки событий типа ContentHandler, связанный с содержимым XML-документа, генерируемый трансформером в результате преобразования. Реализация Stream позволяет использовать в качестве источника и приемника потоки ввода/вывода. Можно использовать в качестве таких потоков любой объект типа:
Обработка ошибок осуществляется объектом типа ErrorListener, который можно прикрепить методом setErrorListener к объекту типа TransformerFactory. В качестве параметра передается TransformerException, из которого можно извлечь информацию о возникшей ошибке. Остановка преобразования - через выброс исключения. Преобразование выполняется методом transform, который запускает процесс преобразования. В качестве параметров указывается Source и Result (которые могут быть разных видов). Пустой трансформер может быть использован для сохранения DOM-дерева в файл. 3.2 Пример программыПрограмма преобразования использует в качестве источника и результата преобразования типы javax.xml.transform.dom.DOMSource и javax.xml.transform.dom.DOMResult соответственно: Для обработки ошибок этапа преобразования используется специальный класс, реализующий интерфейс javax.xml.transform.ErrorListener, который прикрепляется к объекту типа TransformerFactory: Команда запуска программы из консоли Windows будет выглядеть примерно так: Естественно, запуск должен происходить из каталога, в котором находится каталог xslt с программой, а также: MyShop.xsd, MyShop.xml, chassis.xsl, chassis.css и logo.gif . При этом каждый HTML-элемент в полученном документе будет содержать такой атрибут: xmlns:myns="http://mixa1984.narod.ru/myschema.xsd". Можно конечно было обойтись и без этого, но в моей работе было такое требование - использовать квалификацию элементов в XML-документе. В начало страницы |