Технология XSLT

Валиков Алексей Н.

Книга посвящена разработке приложений для преобразования XML-документов с использованием XSLT — расширяемого языка стилей для преобразований. Обсуждается применение языков XSLT и XPath в решении практических задач: выводу документов в формате HTML, использованию различных кодировок для интернационализации и, в частности, русификации приложений, вопросам эффективности существующих подходов для решения проблем преобразования. Для иллюстрации материала используется большое количество примеров.

Для начинающих и профессиональных программистов

Предисловие

О чем эта книга?

Сложно переоценить влияние, которое за последнюю пару-тройку лет оказало на информационные технологии появление и распространение расширяемого языка разметки XML (от англ. extensible Markup Language). XML-технологии нашли применение во множестве областей и стали незаменимыми инструментами для многих решений.

Вместе с тем, сам язык XML — это не более чем текстовый формат представления данных. XML не имеет особого смысла вне практических приложений и сила XML — прежде всего в прикладных технологиях, которые связаны с этим языком.

Эта книга посвящена одной из таких технологий, языку XSLT. XSLT — это расширяемый язык стилей для преобразований (от англ. extensible Stylesheet Language for Transformations), который используется для описания преобразований структуры документов. XSLT позволяет трансформировать одни документы в другие, пользуясь простыми наборами правил преобразования.

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

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

Для кого эта книга?

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

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

Из обычных языков программирования XSLT ближе всего к декларативным языкам типа Lisp и Prolog. Как показывает практика, разработчики, имеющие опыт функционального программирования, вникают в тонкости XSLT немного быстрее остальных. Но это ни в коем случае не означает, что XSLT — сложный язык, доступный лишь избранным, совсем нет. Скорее даже наоборот: XSLT — это простой и понятный язык, работать с которым очень легко и интересно.

Многие из приводимых примеров будут ориентированы на web-решения — в этих случаях хорошую службу может сослужить знание основ web- технологий и языка HTML в частности.

Одна из глав посвящена вопросам использования XSLT совместно с другими языками программирования. Эта информация будет полезна читателям, работающим с такими языками программирования, как Object Pascal, С или С++, Java, JavaScript, VBScript, Python и PL/SQL.

Как работать с книгой?

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

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

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

http://xpath.info

и самостоятельно их опробовать.

Приложение 1

содержит обзор наиболее популярных XSLT-процессоров с подробным перечислением их характеристик. Этот раздел ориентирован, прежде всего, на читателя, который оказался перед выбором процессора для практического применения. Однако, для того чтобы изучать XSLT и выполнять приведенные в книге примеры, мы настоятельно рекомендуем процессор Saxon и его облегченную версию для Windows — Instant Saxon.

Причин тому несколько. Прежде всего, этот процессор, пожалуй, является наиболее стандартным в том смысле, что его поведение с точки зрения спецификации языка является практически идеальным. Вторая причина — переносимость. Поскольку Saxon написан на Java, работает он на любых Java- совместимых платформах. Наконец, Saxon почти идеален с точки зрения расширяемости.

Структура книги

Книга состоит из двенадцати глав и четырех приложений, содержание которых мы кратко опишем ниже.

Глава 1. Введение в XML

Первая глава книги об XSLT не случайно посвящена языку XML (от англ. extensible Markup Language — расширяемый язык разметки). XML — это фундаментальная концепция, по отношению к которой XSLT является прикладной технологией и поэтому для эффективного применения XSLT нужно хорошо понимать основы XML.

Мы разделяем мнение множества экспертов о том, что лучшая документация по XML — это спецификация языка, снабженная внятными аннотациями, комментариями и примерами. Первая глава описывает синтаксис и конструкции языка XML именно в том виде, в каком они приведены в технической рекомендации Консорциума W3, акцентируя внимание на важных с точки зрения XSLT моментах.

Помимо синтаксиса и физической модели ХМL-документа, в первой главе раскрывается концепция XML, идея, которая за всем этим стоит. Краткий обзор практических аспектов использования XML подкреплен описаниями архитектуры типовых проектов, основанных на XML-технологиях.

Завершающая часть первой главы посвящена истории языка XML.

Глава 2. Введение в XSLT

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

Особое внимание уделяется практическому использованию XSLT в составе информационных систем. Во второй главе рассматриваются наиболее естественные области применения технологии XSLT.

Глава заканчивается краткой справкой об истории языка XSLT.

Глава 3. Идея и модель языка XSLT

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

почему

это работает именно так.

Глава 4. Структура преобразования

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

Соглашения

Расширенная форма Бэкуса-Наура

Несмотря на то, что эта книга главным образом посвящена языку XSLT, в ней также описываются расширяемый язык разметки XML и язык обращения к частям ХМL-документов, называемый XPath. Подробное и точное описание этих языков невозможно без четких определений синтаксических конструкций.

Для описания синтаксиса рассматриваемых языков мы будем использовать расширенные формы Бэкуса-Наура (РФБН, или, по-английски, Extended Backus-Naur Form, EBNF). EBNF — это современная модификация методологии, которая впервые была использована для описания языка программирования Алгол-60. За прошедшие десятилетия формы Бэкуса-Наура были доработаны множеством авторов и сейчас в расширенном виде используются для описания ряда языков программирования различной степени сложности. EBNF-нотация также широко используется в технических рекомендациях Консорциума W3, которые фактически и являются стандартами рассматриваемых нами языков.

Нотация EBNF определяет язык как набор синтаксических правил, определяющих нетерминалы (конструкции языка) через терминалы (символы языка), а также другие нетерминалы. Правило состоит из двух частей, разделенных символами "

::=

":

конструкция ::= определение конструкции

В левой части правила стоит терминал определяемой конструкции, в правой — выражение, определяющее эту конструкцию. Правила EBNF также иногда называют продукциями, и мы тоже часто будем использовать этот термин, чтобы не путать эти правила с шаблонными правилами преобразований, которые главным образом и составляют преобразования в языке XSLT.

Обозначения

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

Прежде всего, код программ и текст XML-документов будет выделяться моноширинным шрифтом

Courier

. Листингам многих примеров будут предшествовать заголовки вида

<!-- Текст входящего документа -->

Для того чтобы текст XML-документов был более наглядным, в листингах он будет форматироваться с пробельными отступами, например:

Глава 1

Введение в XML

Что такое XML?

За последние несколько десятков лет, прошедших с создания первых электронных устройств, в игру с природой человеком была введена третья сторона — вычислительные машины. Человек постепенно доверил им свою память, переложил на них сложные алгоритмические задачи, вычисления, принятие решений, и вообще все то, с чем плохо справлялся сам в информационном мире.

Но на всем пути становления информационных систем человек неизбежно сталкивался с одной и той же проблемой — с проблемой понимания. Если два человека, говорящие на разных языках, попробуют объяснить что- нибудь друг другу, то это легко может получиться, когда проблема проста, например, "как пройти к большому зданию с куполом наверху?". Однако же, в случае, если объяснить нужно что-нибудь более сложное, то, не зная языка собеседника, сделать это будет очень трудно.

Проблема понимания между человеком и машиной усугубляется еще и тем, что машина — это цифровое устройство, и все данные в ней состоят из атомов информации — битов, принимающих только два значения — "0" (что иногда понимается, как "нет" или "ложь") и "1" ("да", "истина"). Изначально цифровые устройства вообще использовались только для решения математических задач — расчета баллистики, шифрации и тому подобного.

Для машинной записи естественных языков люди ставили в соответствие символам числа, организуя, таким образом, текстовую информацию в машинном представлении. Это был первый шаг на пути взаимопонимания между машинами и человеком — отпала необходимость писать программы в двоичных кодах. В течение короткого времени было создано множество языков программирования, одновременно понятных как человеку, поскольку они использовали синтаксические конструкции естественных языков, так и машине, потому как могли быть переведены (транслированы) в машинные коды.

Затем произошел взрыв. Программирование, которое во времена машинных кодов было уделом энтузиастов, стало массовым, идеи и вложения полились рекой, и дальнейшее развитие информационных технологий можно сравнить с распространением ударной волны.

Разметка документов

Идею разметки документов будет проще всего проиллюстрировать на примере. Представим себе следующий рекламный текст:

Предлагаем Вашему вниманию новый 3-х камерный холодильник "Горск" объемом 250 л. и стоимостью всего 4500 рублей! Новый дизайн, быстрое охлаждение и низкое энергопотребление, 3-х годовая гарантия на все узлы и агрегаты, а также бесплатная доставка по городу! Заказывайте прямо сейчас по телефону 091-12-15. Фирма "Горск-Холод".

Размещая это объявление где-нибудь на Web-сайте, нам может понадобиться выделить некоторые части, чтобы получить представление вида:

Предлагаем Вашему вниманию новый 3-х камерный холодильник "Горск" объемом 250 л. и стоимостью всего 4500 рублей! Новый дизайн, быстрое охлаждение и низкое энергопотребление , 3-х годовая гарантия на все узлы и агрегаты, а также бесплатная доставка по городу! Заказывайте прямо сейчас по телефону 091-12-15.

Фирма "Горск-Холод".

XML снаружи и изнутри

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

Для того чтобы познакомиться с устройством XML-документов, рассмотрим простой пример:

<?xml version="1.0"?>

<advert>

 <product title="Слон">

Конструкции XML

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

Элемент

Теги в XML-документе не просто размечают текст — они выделяют объект, который и называется

элементом

. Элементы являются основными структурными единицами XML — именно они иерархически организуют информацию, содержащуюся в документе.

Элементы могут быть пустыми, то есть не содержать ни данных, ни других конструкций, либо непустыми — включать в себя текст, другие элементы и т.п.

Пустой элемент имеет следующий вид:

< имя атрибут1 =" значение1 " атрибут2 =" значение2 " и т.д. />

Атрибут

В элементах можно использовать атрибуты с присвоенными им значениями. Атрибут задается в следующем виде:

атрибут =" значение "

Например, в записи гипертекстовой ссылки

<а href="http://www.xsltdev.ru">Заходите к нам!</а>

элемент

а

имеет атрибут

href

, которому присвоено значение

"http://www.xsltdev.ru"

.

Инструкция по обработке

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

<?приложение содержимое?>

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

приложение

, определяет программу или систему, которой предназначена вторая часть, ее

содержимое

.

Примером инструкции по обработке может послужить следующая запись:

<?serv cache-document?>

Секции СDATA

Секции CDATA выделяют части документа, внутри которых текст не должен восприниматься как разметка. CDATA означает буквально "character data" — символьные данные. Секции CDATA задаются следующим образом:

<![CDATA[ содержимое ]]>

Поскольку синтаксис разметки документов в XML имеет текстовую форму, часто бывает, что само содержимое документа может быть воспринято как разметка. В том случае, когда этого желательно избежать, самым простым выходом будет поместить такие данные внутрь секции CDATA.

Следующий текст в документе

Пространства имён

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

За время существования XML была создана разметка для большого числа задач. На таких Web-сайтах, как

http://www.xml.org

,

http://www.schema.net

и

http://www.ebxml.org

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

Часто случается, что различные логические схемы документов используют одни и те же имена элементов в различных смыслах. Это не является проблемой, если в документе используется только одна схема. Но представьте себе ситуацию, когда в одном и том же документе необходимо использовать элементы нескольких различных схем — будет попросту невозможно определить, какой элемент относится к какой схеме, и, вообще, какие схемы были использованы в документе. Для решения этих проблем в XML используются пространства имен (англ. namespaces).

Чтобы различать схемы документов, каждой из них ставится в соответствие уникальный идентификатор ресурса (URI). Две схемы будут считаться тождественными тогда и только тогда, когда их уникальные идентификаторы будут совпадать, поэтому нужно осторожно выбирать URI для создаваемой схемы документа. Очень часто в качестве URI используются URL различных Web-сайтов. Это совсем не означает, что по указанному адресу должно что-либо находиться, просто такой способ практически гарантирует уникальность — вряд ли кому придет в голову использовать адрес чужого сервера в качестве идентификатора своей схемы.

Расширенные имена

Использование пространств имен значительно изменяет понятие имени. Действительно, если

www:template

,

xsl:template

или просто

template

могут быть одинаковыми именами, то именем в таком случае должна считаться не просто символьная последовательность, которая его составляет, а нечто большее.

Вследствие этого в спецификациях группы XML-языков вводится такое понятие, как расширенное имя, которое состоит из двух частей: локальной части и идентификатора пространства имен, которое соответствует префиксу имени.

Представим себе элемент вида

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

Структура XML-документа

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

В первой версии XML для определения логической структуры документов использовался набор формальных правил, называемый DTD — декларацией типа документа (document type declaration). Помимо этого, в начале мая 2001 года была принята новая техническая рекомендация языка под названием XML-схема (XML Schema), которая также формально задает логическую структуру документа, определяет используемые типы данных, количество повторений и многое другое.

В этой главе мы разберем основы логического построения ХМL-документов с использованием DTD.

Декларация типа документа (DTD)

Декларация типа документа состоит из одного или нескольких правил-ограничений структуры документа. В частности, DTD позволяет задавать следующие правила:

□ 

ELEMENT

— определение элемента;

□ 

ATTLIST

— определение списка атрибутов элемента;

□ 

ENTITY

— определение сущности;

□ 

NOTATION

— определение нотации.

Определение элемента

Определение элемента задает имя и тип содержимого элемента в следующем виде:

<!ELEMENT имя содержимое>

Имя элемента должно начинаться с буквы, подчеркивания ("

_

") или двоеточия ("

:

") и содержать буквы, цифры, некоторые знаки пунктуации (такие, как "

_

" — подчеркивание, "

:

" — двоеточие, "

.

" — точка, "

-

" — тире или знак минуса) и модифицирующие символы (

см. разд. "Базовые продукции ХМL" данной главы

).

Примером имени элемента может быть "

A

", "

B:12

", "

MyEasyName

", "

doc.xml

".

В качестве содержимого элемента может быть указано:

Определение списка атрибутов

Список атрибутов некоторого элемента задается следующим образом:

<!ATTLIST элемент

 атрибут1 тип1 значение1

 атрибут2 тип2 значение2

 и т. д ...>

Определение сущности

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

сущностями

. Сущности в XML не имеют ничего общего с сущностями в методологии "сущность-связь". Самый близкий аналог в традиционных языках программирования — это макроподстановка.

Существует два способа определения сущности — внутреннее и внешнее.

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

Внутреннее определение сущности имеет вид:

<!ENTITY имя " значение ">

Символьные данные в XML-документах

Каковы бы ни были структура и синтаксис текстового документа, основой его всегда являются символы. Для хранения и обработки текста на компьютерах, которые по своей природе являются цифровыми устройствами, каждому символу нужно поставить в соответствие числовой код.

Проблема многих языков заключается в том, что для них существует несколько альтернативных кодировок символов. Например, для кириллицы существуют такие кодировки, как CP-866, KOI8-R, CP-1251, ISO-8859-5, кодовая страница Macintosh и другие, но вместе с тем не существует единого стандарта, принятого де-факто. В итоге, для того, чтобы быть уверенным, что документ будет прочтен, его нужно представлять в трех или четырех кодировках, что очень неудобно.

Для того чтобы решить эти и некоторые другие проблемы, был создан стандарт Unicode. Unicode присваивает уникальный код любому символу, независимо от платформы, независимо от программы, независимо от языка. Символам кириллицы Unicode присваивает коды в диапазоне от

#x400

до

#x4ff

. Таблица кодов для кириллицы может быть найдена в формате PDF на Web-сайте Unicode:

http://www.unicode.org/charts/PDF/U0400.pdf

.

Использование Unicode

Для описания символов сотен языков всего мира, а также других символьных обозначений (например, математических символов) Unicode позволяет использовать три формы кодирования — UTF-8, UTF-16 и UTF-32.

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

□ Символы с кодами в интервале

#x0

#x7F

кодируются одним байтом, первый бит которого равен нулю.

□ Для остальных символов число байт определяется количеством ведущих единиц первого байта последовательности.

Коды некоторых символов Unicode

В таблицах символов Unicode кодируются не только символы и знаки различных языков, но также и некоторые управляющие символы, например, неразрываемый пробел (no-break space), табуляция, перенос строки и так далее. Коды некоторых из этих символов, часто использующихся в XML-технологиях, мы приводим в табл. 1.4.

Таблица 1.4 . Unicode-коды некоторых символов

Коды многих других символов можно найти на Web-сайте Unicode Consortium в разделе Code Charts:

http://www.unicode.org/charts/

.

Использование технологии XML

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

Пока же необходимо сказать следующее — несмотря на всю мощь XML, это далеко не панацея и не решение всех проблем, которые могут возникнуть. Нужно хорошо понимать, что XML — это всего лишь формат описания данных. Четкий, конкретный, независимый, мощный формат описания данных — но не более! XML-технологии могут решить проблемы представления, несоответствия синтаксиса семантике и многие другие проблемы организации данных в документе, но они не смогут решить чисто программистских задач — как обрабатывать эти документы. XML не имеет особого смысла вне прикладных задач.

В качестве типичного примера можно привести язык XSLT (язык расширяемых стилей для преобразований, extensible Stylesheet Language for Transformations), который находится в фокусе этой книги. Программы, написанные на XSLT, называются преобразованиями, и они являются в прямом смысле XML-документами, но при этом удовлетворяют логической схеме языка XSLT. При этом преобразования не имели бы смысла без XSLT-процессора, который может применять их к другим документам. Они были бы просто текстом.

Создание XML-документов без программного обеспечения, которое будет понимать их семантику — это все равно, что писать программы на языке программирования, для которого не существует трансляторов и интерпретаторов. Они могут быть безупречно корректными, но совершенно бесполезными.

Стандартизированный и совсем не сложный синтаксис XML позволил многим компаниям разработать средства для синтаксического разбора XML-документов. Программы такого рода называют XML-парсерами (англ. parse — разбирать, анализировать). В настоящее время существует два основных типа XML-парсеров: SAX-парсеры и DOM-парсеры. Оба типа широко используются в различных приложениях — парсеры избавляют от необходимости писать собственные синтаксические анализаторы, штудировать спецификации и так далее. Мы коротко опишем каждый из этих типов.

SAX-парсеры

SAX расшифровывается как Simple API for XML, что означает буквально "Простой прикладной интерфейс программирования для XML". Это так и есть — идеология SAX очень проста. Программист должен описать, как следует обрабатывать ту или иную конструкцию документа, а парсер при обработке документа уже сам будет выполнять соответствующие действия. Иными словами, обработка документа производится в виде реакции на события, которые возникают, когда парсер встречает в документе тот или иной элемент, атрибут, комментарий и так далее.

В отличие от DOM-парсеров, SAX-парсеры не создают никакого внутреннего представления документа, оставляя эту задачу на совести программиста. Вследствие этого SAX-парсеры менее требовательны к ресурсам, что часто бывает критичным. Однако это никак не сказывается на их функциональности, таким образом SAX-парсеры являются незаменимыми инструментами для синтаксического разбора XML-документов. Зачастую, более сложные DOM-парсеры используют SAX как составную часть.

DOM-парсеры

Как уже было упомянуто абзацем выше, легкие SAX-парсеры не создают внутреннего представления ХМL-документов, вполне справедливо считая, что этим придется заняться программисту.

Вместе с тем, древовидная организация данных в ХМL-документах настолько очевидна, что внутренние представления, которые использовались в совершенно разных приложениях, совпадали практически в точности. Такая ситуация привела к решению разработать единый интерфейс не для обработчика документа, как это было сделано в SAX, а для внутреннего представления XML-документа целиком.

Набор таких интерфейсов получил название DOM (document object model, объектная модель документа). DOM-парсер обрабатывает документ, создавая при этом его внутреннее объектное представление. При этом DOM содержит только определения интерфейсов, никоим образом не регулируя внутреннюю реализацию самой модели документа. Все обращения к данным и структуре, которыми обладает документ, происходят посредством вызова методов, определенных в соответствующих интерфейсах.

Объектную модель документа полезно использовать там, где требуется работать с документом целиком, как с деревом. Представление всего документа будет занимать в памяти значительный объем, поэтому DOM резонно считается моделью, очень требовательной к ресурсам.

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

Основные классы задач XML

В этой главе мы разберем несколько основных типов задач, для решения которых целесообразно применять XML. Естественно, этот список даже близко не претендует на полноту, так же, как нельзя, например, перечислить все программы, которые можно написать на языке Java. Несколько примеров предметных областей, которые будут приведены, иллюстрируют классические проблемы, с успехом решенные XML-технологиями.

Создание новых языков

Хотя мы и говорим об XML, как о формате описания данных, на самом деле XML — это

метаязык

, язык, который описывает другие языки. Строго говоря, когда мы создаем XML-документ, мы создаем его не на XML, а в соответствии с XML-синтаксисом. XML — это всего лишь набор синтаксических правил, не более. Настоящим языком в этой ситуации является то, что мы понимаем под логической, семантической схемой создаваемого документа.

Таким образом, каждый раз, когда мы описываем логическую схему документа, мы создаем новый язык с придуманной нами семантикой и XML-синтаксисом. Достоинством XML в данном случае является стандартность этого синтаксиса, поскольку заботиться о создании модуля для синтаксического разбора (парсера) уже не нужно.

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

Главным недостатком XML является громоздкость синтаксиса. Например, арифметическое выражение

2*2

может быть выражено в XML приблизительно как:

<mul>

Хранение данных

Практические всегда, когда приложение должно хранить данные во внешних файлах, неизбежны два процесса: парсинг (синтаксический разбор) при считывании данных и сериализация (создание физического выражения состояния объектов) при сохранении (рис. 1.2).

Рис. 1.2

. Стандартная схема хранения данных

Использование XML в приведенной выше схеме как формата хранения позволяет использовать вместо парсера и сериализатора стандартные XML-инструменты, так что необходимость писать что-то свое отпадает. Кроме того, поскольку сохраняемый в этом случае документ имеет XML-формат, приложение становится совершенно открытым для интеграции с другими системами, ведь обмен данными может быть осуществлен без каких-либо специальных конверторов (рис. 1.3).

Обмен данными и проекты интеграции

Большое количество систем, стандартов и технологий, о которых мы говорили ранее, приводит к тому, что эффективно связать разные источники данных в одну систему не получается. Даже такие, казалось бы, однородные источники, как системы управления базами данных, применяют языки запросов и форматы представления выбираемой информации, которые редко полностью совместимы между собой. Как следствие, проекты интеграции в таких условиях требуют больших усилий — требуется вникать в детали различных баз данных, протоколов, операционных систем и так далее.

В результате интеграция нескольких приложений или систем реализуется по схеме, показанной на рис. 1.4.

Рис. 1.4

. Типичная схема интеграции нескольких приложений

Несложно оценить трудозатраты подобного рода проекта. Заставить разные системы работать вместе — чрезвычайно трудоемкая задача.

Краткая история XML

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

Несмотря на то, что идеи обобщенной разметки начали появляться еще в 60-х годах, SGML (standard generalized markup language, стандартный язык обобщенной разметки) был ратифицирован Международной Организацией Стандартизации (ISO) только в 1986 году. Возможно, будет показательным тот факт, что SGML не требовал изменений в течение, практически, 10 лет — настолько мощным инструментом он был.

Вместе с тем, на определенном этапе мощь SGML стала становиться препятствием — этот язык был настолько сложен, что поддержка в приложениях даже основного его подмножества оказалась непростой задачей. Это сказывалось на скорости разработки, стабильности и стоимости приложений, и потому, все больше и больше экспертов высказывались за упрощение этого языка.

Примерно в то же время произошел квантовый скачок в другой области информационных технологий. Развитие сетевых технологий вывело инфраструктуру обмена информации на качественно новый уровень, произведя на свет глобальную сеть Интернет. Интернет, в свою очередь, стал платформой для обмена гипертекстовыми документами, которые также нуждались в простом стандартном языке разметки для базового форматирования текста, создания таблиц и гиперссылок. Для этих целей был разработан HTML — язык разметки гипертекста (hypertext markup language).

HTML основывался на синтаксисе SGML, принципы этой технологии были практически проигнорированы. Только намного позже HTML стал SGML- совместимым языком. Ограниченность и нерасширяемость HTML вела к тому, что производители браузеров (программ просмотра) вводили собственные, в большинстве случаев несовместимые, расширения, что в итоге привело к довольно плачевной ситуации в этой области.