Создание отчетов на основе xsl-трансформаций (xslt). Введение в XSLT

XSLT-преобразования

XSLT обладает большими возможностями для оперирования данными в документах XML. Например, при помощи таблицы стилей (stylesheet) XSLT я мог бы отформатировать данные из planets.xml в таблицу HTML. Таблицы стилей содержат правила, установленные для преобразования XML-документа, и большая часть книги посвящена созданию таблиц стилей и объяснению того, как они работают. Вот как выглядит таблица стилей XSLT planets.xsl (листинг 1.2), преобразующая данные из planets.xml в таблицу HTML (мы проанализируем ее в главе 2).

Листинг 1.2. planets.xsl

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

The Planets Table

The Planets Table

Как видите, эта таблица стилей XSLT выглядит как XML-документ - и для этого есть основания, потому что она им и является. Все таблицы стилей XSLT являются также и документами XML, а раз так, то они должны быть хорошо форматированными документами XML С этими двумя документами - planets.xml (листингом 1.1) и связанной с ним таблицей стилей, planets.xsl (листинг 1.2) - мы будем работать на протяжении всей книги, рассматривая различные возможные преобразования XSLT.

Как вы свяжете эту таблицу стилей с XML-документом planets.xml ? Как мы увидим в следующей главе, одним из способов это сделать является инструкция обработки XML , использующая два атрибута. Первый атрибут - type , который следует установить в «text/xml», чтобы указать, что используется таблица стилей XSLT. (Чтобы использовать таблицы стилей другого типа - каскадирующие таблицы стилей (CSS, cascading stylesheets), обычно использующиеся с HTML - следует задать «text/css».) Второй атрибут - href , которому следует присвоить значение URI (вспомните, что XML использует не адреса URL, а идентификаторы URI, Uniform Resource Identifier) таблицы стилей:

Mercury

.0553

58.65

1516

.983

43.4

Теперь при помощи процессора (processor) XSLT можно применить таблицу planets.xsl к planets.xml и создать новый документ, planets.html . Процессор XSLT создает новый файл planets.html , который вы можете увидеть на рис. 1.2.

Рис. 1.2. HTML-документ, созданный процессором XSLT

Как можно видеть на рис. 1.2, процессор XSLT считывает данные из planets.xml , применяет к ним правила из planets.xsl и создает HTML-таблицу в planets.html. Это наш первый пример XSLT-преобразования.

Что здесь на самом деле происходит? У нас были XML-документ, planets.xml , и таблица стилей XSLT, planets.xsl . Но каким образом они объединились для создания planets.html ?

Из книги XSLT автора Хольцнер Стивен

XSL = XSLT + XSL-FO Сам XSLT в действительности является частью более крупной спецификации - расширенного языка таблиц стилей, Extensible Stylesheet Language, или XSL. XSL предназначен для задания точного, до миллиметра, формата документов. Форматирующая часть XSL, представляющая гораздо более

Из книги Технология XSLT автора Валиков Алексей Николаевич

Преобразования XSLT-XSL XSLT позволяет работать непосредственно с содержимым документов XML. Например, у вас может быть огромный документ XML, содержащий всю бейсбольную статистику за последний сезон, однако вас может интересовать только статистика для питчеров. Чтобы извлечь

Из книги автора

Версии XSLT Спецификации XSLT разрабатывались значительно активнее, чем спецификации для всего XSL. Рекомендация XSLT 1.0 была окончательно принята 16 ноября 1999 г., и эта версия является сегодня основной версией XSLT.Затем появился рабочий проект XSLT 1.1 и, хотя первоначально он

Из книги автора

Что нужно для XSLT-преобразования Для осуществления XSLT-преобразования, такого как преобразование planets.xml в planets.html, необходим XSLT-процессор. Для преобразований документов XML можно использовать XSLT тремя способами: используя отдельные программы, называемые процессорами XSLT.

Из книги автора

XSLT-преобразования на web-серверах Можно осуществлять XSLT-преобразования на web-сервере - так чтобы XML-документ был преобразован до того, как web-сервер отправит его браузеру. Здесь самое распространенное преобразование - это преобразование документа XML в HTML, но

Из книги автора

Ресурсы XSLT В Интернете можно найти огромное количество нужных нам сведений. Имейте в виду, что все приведенные далее адреса URL легко могут измениться; списки будут актуальны столь долго, сколько этого будут хотеть люди, занимающиеся поддержкой перечисленных

Из книги автора

Утилиты XSLT В Интернете существует также много утилит XSLT - в следующем списке перечислены наиболее известные: Microsoft XSL API Extension, http://msdn.microsoft.com/downloads/webtechnology/xml/xslisapi.asp. Упрощает задачу выполнения XSLT-преобразований на стороне сервера; Microsoft XSL-to-XSLT Converter,

Из книги автора

Инструкции XSLT В теле шаблона может присутствовать ряд элементов XSLT, называемых инструкциями: ; ; ; ; ; ; ; ; ; ; ; ;

Из книги автора

Расширяемость XSLT Несмотря на кажущуюся сложность XSLT, он во многих отношениях ограничен по сравнению с языками программирования, и в процессорах XSLT сразу же начали появляться расширения XSLT. Например, Saxon представил элемент , реализуя в XSLT стандартный для

Из книги автора

Из книги автора

Отличия XSLT 1.1 от XSLT 1.0 Отсутствие result tree fragment Главное и наиболее существенное отличие XSLT 1.1 от XSLT 1.0 состоит в том, что тип данных, известный в XSLT 1.0 как result tree fragment (результирующий фрагмент дерева) в XSLT 1.1. отсутствует. Вместо него в версии 1.1 используется множество узлов,

Из книги автора

Отличия XSLT 2.0 от XSLT 1.1 Прежде чем приступить к описанию отличий второй версии XSLT от версии 1.1 (и, соответственно, 1.0), следует сделать одно существенное замечание. Лицензионные соглашения Консорциума W3 не позволяют раскрывать широкой общественности внутренние материалы

Преобразования из XML в XML

Преобразования XML-XML иногда рассматриваются как SQL для Интернета, поскольку они позволяют оперировать запросами к базе данных в XML-документах. Ниже приведен пример. Используемый нами файл planets.xml содержит достаточно много данных о каждой планете:

Mercury

.0553

58.65

1516

.983

43.4

Venus

.815

116.75

3716

.943

66.8

Что, если нам нужно только подмножество этих данных - например, имя и масса каждой планеты? В терминах баз данных planets.xml представляет собой таблицу, и мы хотим создать новую таблицу, содержащую подмножество данных из первой. В базах данных для этого служит язык SQL, а для документов XML мы можем использовать XSLT.

В листинге 1.6 приведена новая версия файла planets.xsl , осуществляющая требуемое преобразование: выбираются только имя и масса каждой планеты, которые отправляются в выходной документ. В особенности обратите внимание на то, что мы осуществляем преобразование XML-XML, поэтому я использую элемент , атрибут method которого установлен в «xml» (фактически тип выходных данных обычно и есть XML, но если процессор XSLT видит тег , он обычно по умолчанию генерирует HTML).

Листинг 1.6. Выбор только имени и массы

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

C:planets>java org.apache.xalan.xslt.Process -IN planets.xml -XSL planets.xsl -OUT new.xml

Вот как выглядит результирующий документ XML, new.xml:

Mercury

.0553(Earth = 1)

Venus

.815(Earth = 1)

Earth

1(Earth = 1)

Отметьте, что этот файл выглядит во многом похоже на исходный файл planets.xml , за тем исключением, что каждый элемент Содержит только элементы и . Таким образом, мы смогли получить подмножество данных первоначального документа XML.

Конечно, можно проводить любое число такого рода преобразований XML-XML. Можно обрабатывать данные в документе XML для создания совершенно новых XML-документов. Например, можно взять XML-документ с именами студентов и их отметками и создать новый документ, отображающий средние оценки. В XSLT есть много встроенных функций, позволяющих работать с данными подобным образом, - мы познакомимся с ними в главе 8.

В дополнение следует сказать, что многие программы используют XML для обмена данными в Интернете, и, так как обычно они форматируют свои документы XML по-разному, еще одним популярным способом использования преобразований XML-XML в Интернете является преобразование XML из формата, используемого одной программой, в формат другой программы.

Из книги C++ автора Хилл Мюррей

8.5.6 Преобразования Конструктор, получающий один параметр, определяет преоразование из типа своего параметра в тип своего класса. Такие преобразования неявно применяются дополнительно к стандартным пробразованиям (#6.6-7). Поэтому присваивание объекту из класса X

Из книги Справочное руководство по C++ автора Страустрап Бьярн

R.4.7 Преобразования ссылок Всюду, где ссылки (§R.8.2.2) инициализируются (включая передачу параметров (§R.5.2.2) и возврат значения функции (§R.6.6.3)) или используются иным образом, возможны следующие преобразования:Ссылка на данный класс может быть преобразована в ссылку на

Из книги Советы по Delphi. Версия 1.0.6 автора Озеров Валентин

R.12.3 Преобразования Преобразования объектов класса можно задать с помощью конструкторов или функций преобразования.Такие преобразования, обычно называемые пользовательскими, используются неявно в совокупности со стандартными преобразованиями (§R.4). Например, функцию

автора Реймонд Эрик Стивен

R.12.3.2 Функции преобразования Функция-член класса X, имя которой имеет вид,имя-функции-преобразования: operator имя-типа-преобразованияимя-типа-преобразования: список-спецификаций-типа opt операция-ptr optзадает преобразование из типа X в тип, определяемый конструкцией

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

Из книги XSLT автора Хольцнер Стивен

18.5.4. Средства преобразования Вторая крупнейшая проблема, связанная с DocBook, состоит в необходимости преобразования старой разметки уровня представления в разметку DocBook. Человек обычно может автоматически преобразовать представление документа в логическую структуру,

Из книги Технология XSLT автора Валиков Алексей Николаевич

Преобразования CSS В главе 22, ведя разговор о канве и программном рисовании на ней, мы узнали о преобразованиях системы координат. С помощью особых расширений CSS мы можем проделать аналогичные действия над любым элементом Web-страницы: сместить его, повернуть, растянуть или

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Преобразования из XML в XML Преобразования XML-XML иногда рассматриваются как SQL для Интернета, поскольку они позволяют оперировать запросами к базе данных в XML-документах. Ниже приведен пример. Используемый нами файл planets.xml содержит достаточно много данных о каждой

Из книги Macromedia Flash Professional 8. Графика и анимация автора Дронов В. А.

Модель преобразования Во вводной главе мы говорили, что преобразования в XSLT являются наборами шаблонных правил, каждое из которых обрабатывает определенный фрагмент входящего документа с тем, чтобы сгенерировать фрагмент выходящего

Из книги автора

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

Из книги автора

Выполнение преобразования Несмотря на полную свободу в порядке выполнения шаблонов, правила изменения контекста и компоновки результирующего дерева, спецификация XSLT оговаривает очень четко - это делает XSLT весьма гибким языком, программы на котором при этом

Из книги автора

Упрощенные преобразования Многие простые преобразования состоят из единственного правила, которое обрабатывает корневой узел входящего документа. Общий вид такого рода преобразований показан в следующем листинге.Листинг 4.2. Простое

Из книги автора

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

Из книги автора

Преобразования типов Преобразование типов производится либо неявно, например при преобразовании по умолчанию или в процессе присваивания, либо явно, путем выполнения операции приведения типа. Преобразование типов выполняется также, когда преобразуется значение,

Из книги автора

Преобразования Преобразований, предусматриваемых Flash, всего два. Однако с их помощью можно задать весьма сложное движение выделенного нами фрагмента

22. DOM XML. Преобразование XML документов

Модель XML DOM. SAX: достоинства и недостатки. Спецификация XSL. XSLT и XPath. XSL-FO. XQuery.

Для программной обработки XML документов используется модель XML DOM, которая определяет объекты и свойства всех XML элементов и методы (интерфейс) для доступа к ним. Иначе говоря, XML DOM описывает каким образом необходимо получать, изменять, добавлять и удалять XML элементы.

Согласно DOM:

    все, что содержится внутри XML документа, является узлом;

    весь документ представляется узлом документа ;

    каждый XML элемент – узел элемента ;

    текст внутри XML элементов - текстовый узел ;

    каждый атрибут - узел атрибута ;

    комментарии - узлы комментариев .

XML документ в соответствии с моделью XML DOM представляется как дерево из узлов, при этом:

    Все узлы дерева находятся в определенных отношениях друг с другом.

    Все узлы доступны через дерево. Их содержимое может быть изменено, удалено; новые элементы могут быть добавлены в дерево.

    Дерево начинается с корневого узла и разветвляется вниз вплоть до текстовых узлов на самом низшем уровне дерева.

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

    Эти отношения описываются с помощью понятий родитель, дочерний и потомок (все дочерние на одном уровне).

Альтернативным интерфейсом для обработки XML документов является SAX .

SAX (Simple API for XML ) - прикладной программный интерфейс для парсера с последовательным доступом к XML. Этот интерфейс предоставляет механизм чтения данных из XML документа.

SAX парсер является поточным и управляемым событиями . Задачей пользователя SAX API заключается в описании методов, вызываемых событиями, возникающими при анализе документа.

Такими событиями могут быть следующие:

    текстовый узел;

    узел элемента XML;

    инструкция обработки XML;

    комментарий XML.

События вызываются появлением как открывающего тэга, так и закрывающего тэга любого из этих элементов документа. Атрибут XML также рассматривается как событие.

Анализ документа является однонаправленным (т.е. без возвратов по дереву).

В отличие от DOM формальной спецификации для SAX не существует. В качестве нормативной рассматривается Java реализация SAX.

Следует отметить следующие достоинства и недостатки SAX.

Достоинства :

    Затраты памяти существенно меньше (зависит от максимальной глубины дерева документа и количества атрибутов в узле элемента), чем в случае DOM (требуется хранить в памяти все дерево документа).

    Скорость работы выше за счет сокращения затрат времени на выделение памяти для элементов дерева в случае DOM.

    Потоковое чтение данных с диска в случае DOM невозможно. Если для размещения всего документа в памяти недостаточно места, то использование SAX является безальтернативным.

Недостатки :

    Процедура проверки правильности предполагает доступ ко всему документу одновременно.

    Это также требуется и в случае XSLT преобразования.

Если загрузить "чистый" XML документ в веб-браузер, то можно будет увидеть древовидную структуру этого документа:

В этом как раз и заключается главное отличие между XML и HTML, а именно разделение структуры документа и его представления в браузере. Конкретный вид XML документа описывается отдельно с помощью CSS или XSL.

CSS и XSL - принципиально разные технологии, имеющие лишь частичное пресечение областей применения. CSS-форматирование применяется к HTML-документу браузером на клиентской стороне , а XSL-преобразование выполняется, как правило, на сервере , после чего результат отправляется браузеру клиента. XSL базируется на XML, благодаря чему XSL более гибок и универсален . У разработчиков имеется возможность использовать средства контроля за корректностью составления стилевых списков (используя схемы XML).

С помощью XSL можно преобразовать XML-документ в формат HTML , WML , RTF , PDF , SQL , SWF , а так же в другой XML и XSL документ. XSL указывает как будет оформлен документ, где и каким образом должны размещаться данные.

Cпецификация XSL состоит из трех частей:

    XSLT (XSL Transformations), язык для преобразования XML;

    XPath - язык путей и выражений, используемый в XSLT для доступа к отдельным частям XML-документа;

    XSL-FO (XSL Formatting Objects), язык для верстки XML.

Наиболее распространенным механизмом XSLT преобразований для систем работающих на платформе Microsoft Windows является MSXML ; для систем на основе GNU - xsltproc .

Для того, чтобы обработать XML документ c помощью XSL, необходимо в XML документе написать следующую инструкцию:

< !-- ... -- >

Возвращаясь к рассмотренному ранее примеру, добавив в XML файл ссылку на XSL файл, получим следующий код разметки:

Проверка почтового ящика

[email protected]

[email protected]

[email protected]

Test

Это письмо не является спамом

[email protected]

[email protected]

Интересное предложение

После загрузки данного документа в веб-браузере его вид кардинально изменится:

Содержимое XSL файла mailbox.xsl приводится ниже:

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

Почтовый ящик

NameMassRadiusDay

From: To:

,

Subject:CCNotify




XSLT и XPath

В результате применения таблицы стилей XSLT, состоящей из набора шаблонов, к XML-документу (исходное дерево) образуется конечное дерево, которое может быть другой XML-структурой , HTML-документом или обычным текстом . Правила выбора данных из исходного дерева записываются на языке запросов XPath . XSLT применяется в основном в веб-программировании и для генерации отчетов.

Благодаря XSLT реализуется отделение данных от их представления в рамках парадигмы MVC (Model-view-controller ).

XPath (XML Path Language) - язык запросов к элементам XML-документа. XPath был разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. В языке XPath используется компактный синтаксис, отличный от принятого в XML. Начиная с версии 2.0, XPath является составной частью языка XQuery . XPath призван помочь обходить всевозможные деревья, получать необходимые элементы из другой ветви относительно точки обхода, распознавать предков, потомков, атрибуты элементов. Это полноценный язык навигации по дереву.

Для нахождения элемента(ов) в дереве документа используются пути адресации.

Каждый шаг адресации состоит из трех частей:

    оси, например child:: ;

    условия проверки узлов, например имена элементов документа body, html;

    предиката, например attribute::class .

Дополнением к ядру языка является набор функций, которые делятся на 5 групп: системные функции, функции с множествами , строковые функции, логические функции, числовые функции.

XSL-FO

XSL-FO (eXtensible Markup Language Formatting Objects) - рекомендованный W3C язык разметки предпечатных материалов. По-сути, XSL-FO - это унифицированный язык представления. Он не имеет семантической разметки (как в HTML) и сохраняет все данные документа внутри себя (в отличие от CSS, который модифицирует представление по умолчанию для внешнего HTML или XML-документа) .

В результате применения XSLT-преобразования к исходному XML документу получается его описание на языке XSL-FO . FO-процессор конвертирует XSL-FO-документ в какой-либо читаемый и/или печатаемый формат. Наиболее часто используется преобразование в PDF либо PS; некоторые FO-процессоры могут давать на выходе RTF-файлы либо просто показывать документ в окне.

XQuery

XQuery - язык запросов, разработанный для обработки данных в формате XML.

В настoящее время рабочими группами консорциума W3C ведутся работы по развитию этого стандарта данного языка, с добавлением выражений для свободного поиска по тексту и для внесения изменений в XML документы и базы данных, а также для процедурных операций.

В рамках стандарта SQL:2006 разработаны механизмы для встраивания XQuery -запросов непосредственно в SQL-запросы.

Не прошло и трёх лет с тех пор, как у меня зародилась мысль о том, что пора изучать XSLT -))). Мысль зародилась, а везде ещё стоял PHP 4 и зверствовал Salbotron , который, мягко говоря, не отличался высокой производительностью. Да и редко какой браузер мог похвастаться поддержкой этого самого XSLT. По этим соображениям изучение столь перспективного направления я отложил до лучших времён. На данный момент можно смело заявить, что эти времена настали, поскольку вышел PHP 5 с поддержкой XSLT и сносной объектной моделью, а все топовые браузеры уже сами уверенно держат преобразования, только подавай XML. :)

  • http://w3c.org - комитет по разработке и продвижению стандартов всемирной паутины Internet. На данный момент он является первоисточником практически всех веб-ориентированных стандартов и рекомендаций.
  • http://www.w3.org/TR/xml - спецификация расширяемого языка разметки XML , который является основой современного веба. На момент написания статьи доступна пятая редакция версии 1.0, а также вторая редакция версии 1.1.
  • http://www.w3.org/TR/xml-names - спецификация использования пространств имён в XML.
  • http://www.w3.org/TR/xpath - спецификация по использованию языка поиска частей XML-документа XPath .
  • http://www.w3.org/TR/xsl/ - спецификация расширенного языка стилей XSL .
  • http://www.w3.org/TR/xslt - спецификация языка преобразований XSLT .
  • http://validator.w3.org/ - валидатор HTML .
  • http://www.w3.org/TR/xhtml1/ - спецификация XHTML1.0 .

Переводы на русский язык:

  • http://www.rol.ru/news/it/helpdesk/xml01.htm - Расширяемый язык разметки XML1.0 (вторая редакция). /Радик Усманов/
  • http://www.rol.ru/news/it/helpdesk/xnamsps.htm - Пространства имен в XML. /Радик Усманов/
  • http://www.rol.ru/news/it/helpdesk/xpath01.htm - Язык XML Path (XPath ). /Радик Усманов/
  • http://www.rol.ru/news/it/helpdesk/xslt01.htm - Язык преобразований XSL (XSLT ). /Радик Усманов/

Для лучшего понимания всего происходящего я рекомендую читать спецификации в следующем порядке:

  1. XML (это основа!)
  2. пространства имён (механизм разнородного XML-кода в одном файле)
  3. XPath (язык выборки элементов из дерева структуры)
  4. XSLT (преобразования)
  5. XHTML (то, к чему нужно стремиться)

Особо пытливые могут также уделить внимание расширенному языку стилей XSL .

2. Валидный XHTML

Что такое валидный XHTML? В первую очередь, это XML-документ, который должен соответствовать спецификации XML. Во-вторую, почти обычная HTML-страница, к которой все привыкли.

Почему нужен именно XHTML? Исключительно из соображений совместимости и кросс-браузерности. Страница в XHTML будет с большей вероятностью отображаться корректно в популярных браузерах, чем обычный HTML.

Для рядового клепателя страниц словосочетание XML-документ должно означать следующее:

  1. Документ содержит объявление XML-документа в самом начале страницы:
  2. Документ содержит один корневой элемент, в котором находятся все остальные.
  3. Все элементы (тэги) должны иметь закрывающую часть (
    , ).
  4. Атрибуты всегда имеют значение, которое обязательно указывается в кавычках (одинарных или двойных). Например, "radio" disabled="disabled" /> .
  5. Управляющие символы & , < и > всегда должны маскироваться. Например, "?a=1&b=2" > & . Исключение составляет только , внутри которого спецсимволы можно не маскировать.

Также сам XHTML обязывает выполнять следующие условия:

  1. Документ должен объявлять пространство имён, в рамках которого будут использоваться элементы HTML.
  2. Документ должен объявлять DOCTYPE перед корневым элементом и указывать в нём один из типов XHTML и соответствующий DTD.

Пример простого документа XHTML1.0:

И так обо всём по порядку.

    Объявление XML-документа, в котором указывается его версия и кодировка.

    Объявление пространства имён и используемого языка.

Три версии XHTML1.0 предназначены для лучшей обратной совместимости:

  • Strict - обеспечивает наибольшее соответствие рекомендациям W3C со стороны браузеров. Однако и сам HTML-код должен следовать этим рекомендациям.
  • Transitional - менее строгое соответствие, которое заставляет браузер вести себя так, как если бы это был обычный HTML-документ.
  • Frameset - позволяет использовать фреймы.

XHTML1.1 по сути является тем же XHTML1.0 Strict и призван вытеснить другие версии XHTML1.0. Однако, по сравнению с XHTML1.0 Strict, у него есть ряд отличий :

  1. Удалён атрибут lang , его роль выполняет xml:lang . (Модуль [ XHTMLMOD ])
  2. Для элементов a и map вместо атрибута name нужно использовать атрибут id . (Модуль [ XHTMLMOD ])
  3. Доступен набор элементов ruby . (Модуль [ RUBY ])

Итак, если вам нужна наибольшая кросс-браузерность и совместимость с рекомендациями W3C, то XHTML1.1 самое оно!

Из этих соображений результатом моих преобразований будет именно XHTML1.1.

3. XSLT-преобразования

Что такое XSLT? Это язык преобразований XML-документа, который был разработан как часть расширенного языка стилей (XSL).

Зачем нужен XSLT? Он позволяет реализовать схему, при которой данные хранятся отдельно, а их представление отдельно. То есть, один XML-документ преобразуется с помощью другого XML-документа (XSL, в котором находятся XSLT-шаблоны) в конечный документ. Результатом может быть XML, HTML или текстовый документ любого формата.

Для того, чтобы воспользоваться XSLT-преобразованиями, в первую очередь нужно сформировать правильный стиль XSL и подключить его к XML-файлу.

Валидным XSL-документом является XML-документ, у которого задано пространство имён xsl и присутствует корневой элемент stylesheet. В самом простом случае стиль может выглядеть, например, так:

Этот стиль не содержит каких-либо явных определений шаблонов или других элементов XSL. Однако, его уже можно использовать. Чтобы посмотреть результат, достаточно сформировать произвольный XML-документ и подключить к нему этот стиль:

За подключение стиля отвечает строка:

При этом кодировка результата будет UTF-8, несмотря на то, что исходный документ был сформирован в windows-1251. К сожалению, браузеры обычно не позволяют просмотреть код результирующего документа, но модуль XSLT в PHP5 даёт возможность передать результирующий код в переменную, которую можно сохранить в файл. Поэтому, используя PHP, я приведу исходный код результирующего документа:

Этот код не является валидным XML-документом и тем более XHTML1.1. Для того, чтобы сформировать нужный код, я усложню исходный XSL-стиль и добавлю туда необходимые шаблоны и преобразования. При этом исходный XML-документ останется без изменений.

В качестве примера я приведу XSL-стиль, который при помощи XSLT будет выводить список атрибутов исходного XML-документа с их значениями, при этом будет формироваться валидный XHTML1.1. Итак, стиль:

Файл - test.xsl
"/" > "http://www.w3.org/1999/xhtml" xml:lang="ru" > Мой первый XSLT
Мой список:
  1. background-color: #eee;
Разработчик парсера: "system-property("xsl:vendor-url")" />

Чтобы понять, как он работает, я распишу каждое действие отдельно:

    Объявление XML-документа:

    Обязательным атрибутом является определение пространства имён xsl через атрибут xmlns:xsl="http://www.w3.org/1999/XSL/Transform" .

    Следующим шагом в корневом элементе stylesheet объявляется, каким образом нужно формировать результирующий документ:

    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />

    Основные атрибуты:

    • method="xml" - метод вывода документа. Результирующий документ будет в формате XML.
    • encoding="windows-1251" - кодировка результирующего документа.
    • omit-xml-declaration="no" - пропускать или нет начальное объявление XML-документа (). Может иметь значение "yes" или "no" (актуально только для html).
    • indent="yes" - формировать отступы согласно уровню вложенности. Может иметь значение "yes" или "no".
    • media-type="text/xml" - MIME-тип результирующего документа (используется только для метода вывода html).
    • doctype-public="-//W3C//DTD XHTML 1.1//EN" - тип результируюшего документа (DOCTYPE)
    • doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" - ссылка на DTD

    Если метод вывода объявлен html, то значения атрибутов encoding и media-type будут подставлены в заголовок страницы ( ... ) посредством метатега.

    Объявление основного шаблона:

    Атрибут xmlns="http://www.w3.org/1999/xhtml" указывает на пространство имён xhtml, которое будет применено по умолчанию к этому элементу и всем дочерним элементам, у которых оно не задано явно.

    Атрибут xml:lang="ru" указывает на язык, в котором сформирована страница (будущая).

Эта часть стиля была нужна для формирования атрибутики валидного XHTML1.1 кода.

Теперь что касается XSLT-преобразований:

    Вставка простого текста:

    Атрибут select принимает выражение XPath, на основе которого делает выборку. Если выборка вернула список узлов, то начинает работать цикл по каждому элементу.

    В данном случае выборка вернёт список атрибутов для этого (корневого) и всех дочерних элементов.

    Проверка условия:

    В данном случае, если позиция элемента чётная (определяется вышестоящим if), то в стиль элемента

  1. будет прописан серый цвет фона.

    Вывод значений элемента:

    Этот код подставит в вышестоящий элемент строку, собранную из имени текущего элемента и его значения. Содержимое атрибута select соответствует XPath.

    Разработчик парсера: "system-property("xsl:vendor-url")" /> "system-property("xsl:vendor-url")" /> "system-property("xsl:vendor")" />

Результатом обработки этого стиля (test.xsl) станет такой код:

Результат - исходный код
"1.0" encoding="windows-1251" ?> "http://www.w3.org/1999/xhtml" xml:lang="ru" > Мой первый XSLT
Мой список:
  1. attr1 = Главный атрибут
  2. style=" background-color : #eee ; " > attr1 = мой атрибут1
  3. attr2 = мой атрибут2
  4. style=" background-color : #eee ; " > attr5 = Халявный атрибут
Разработчик парсера: libxslt

Этот код соответствует стандарту XHTML1.1 и был сформирован на основе исходного XML-документа. Для проверки можно воспользоваться валидатором от W3C, который расположен по адресу http://validator.w3.org/ .

В браузере этот код выглядит примерно так:

// Вывод кода HTML в виде текста header("Content-Type: text/plain;" ); // Объект исходного XML-документа $xml = new DOMDocument(null , "windows-1251" ); $xml ->load("test.xml" ); // Объект стиля $xsl = new DOMDocument(null , "windows-1251" ); $xsl ->load("test.xsl" ); // Создание парсера $proc = new XSLTProcessor(); // Подключение стиля к парсеру $proc ->importStylesheet($xsl ); // Обработка парсером исходного XML-документа $parsed = $proc ->transformToXml($xml ); // Вывод результирующего кода echo $parsed ; // Запись файла с результирующим кодом file_put_contents("parsed.html" , $parsed ); ?>
IE 6 FireFox 3 Opera 9.02

Дополнительную информацию по использованию XSLT в PHP5 можно найти по адресу http://ru2.php.net/manual/ru/book.xslt.php .

Мысли вслух

«Товарищи, мы стоим на краю огромной пропасти! И я предлагаю сделать большой, решительный шаг вперёд!»

2019 Антон Прибора. При копировании материалов с сайта, пожалуйста, указывайте ссылку на источник.



 Top