XML на экране броузера
Аббревиатура XML в последнее время, как говорится, "на слуху". Поддержку XML обещают производители новых броузеров, разрабатываются XML-редакторы, все чаще можно услышать об очередных невероятных применениях XML. Что же стало причиной появления и столь быстрого распространения этой технологии?
Большинство специалистов почти единодушны в том, что HTML плохо справляется с возросшими требованиями к публикуемым в Web документам и ему необходимо срочно искать замену. Одним из первых кандидатов на роль основного языка представления информации считается именно XML.
С момента появления XML прошло совсем немного времени, однако он очень быстро стал популярным. Многие уже выбрали его в качестве инструмента для работы и, похоже, не раскаиваются в содеянном.
Универсальное средство описания данных
Несмотря на то что XML часто рассматривают как альтернативу HTML, в списке применений данного языка достаточно редко встречаются ссылки на Web-узлы, использующие XML именно для разметки документов. Здесь явно лидируют сообщения о специализированных языках описания данных, построенных на его основе.
Одним из первых таких языков стал AML (Astronomical Markup Language), созданный для обмена не только параметрами небесных объектов, но также статьями, таблицами, изображениями, сведениями о персонале, одним словом, любой информацией, необходимой в повседневной жизни обсерватории. За астрономами последовали и другие ученые. Для представления математических данных и передачи их по сети был разработан MathML (Mathematical Markup Language). Целую серию подобных продуктов создали биологи: SBML (Systems Biology Markup Language), BIOML (BIOpolymer Markup Language), BSML (Bioinformatic Sequence Markup Language) и др.
Активно ведутся работы и в других областях. Проект VHG (Virtual HyperGlossary) предполагает построение системы взаимосвязанных словарей, призванных образовать "терминологическую среду" для разнообразных документов. Язык описания векторной графики VML (Vector Markup Language) должен обеспечить поддержку наборов изображений, объединенных посредством ссылок. Создаются также языки, специально предназначенные для работы с архивами, для построения обучающих систем. Этот список можно продолжать очень долго. Надо ли говорить, что в основе всех перечисленных языков лежит все тот же XML?
Такое обилие применений не случайно. Ведь XML-файл уже сам со себе -- готовая иерархическая база данных. Остается лишь задать ограничения и написать язык запросов, основой для которого послужит... все тот же XML. На роль такого языка запросов претендует XML-QL, причем версия 0.9 уже доступна пользователям. Аналогичную цель ставили перед собой и создатели языков XQL, YATL и XSQL.
А как же Web?
Итак, описание данных, язык запросов. А как же собственно "ML"? Ведь XML -- это eXtensible Markup Language, т. е. язык разметки. Как он выглядит в качестве альтернативы HTML? И нужна ли эта альтернатива? На последний вопрос большинство специалистов единодушно отвечают "Да!". Язык HTML плохо справляется с ролью основного средства публикации в Web. Главный его недостаток состоит в полном отсутствии инструментария для структурирования документов. Такое качество, как гибкость, тоже мало присуще HTML. Новые возможности в лучшем случае станут доступными с выходом очередной версии, а до тех пор -- обходись тем, что имеешь.
Создатель же XML-документа не ограничен фиксированным комплектом дескрипторов. Более того, предопределенного их набора попросту не существует -- все дескрипторы, необходимые для описания документа, разработчик придумывает сам. Для тех, кто привык работать с HTML, это кажется невероятным.
Полная свобода в выборе имен элементов компенсируется жесткими требованиями к структуре документа. В отличие от HTML, в XML каждому открывающему дескриптору соответствует закрывающий, пара дескрипторов формирует элемент XML. Правда, в XML-документе могут встречаться и одиночные дескрипторы, но это не исключение из правила, а лишь пара дескрипторов, объединенная в один.
Строгая иерархия и отношение родительский--дочерний между элементами XML открывают новые, невиданные ранее возможности при реализации средств поиска. Сейчас, когда содержимое Web в основном состоит из HTML-документов, пользователю приходится довольствоваться поиском по ключевым словам. Если в документе отсутствует структура, поисковая система не может, например, по ключевому слову Pascal определить, идет речь о языке программирования или об ученом, в честь которого этот язык был назван. Если же документы структурированы, вопрос с контекстом решается гораздо проще: надо, задавая критерии поиска, указать требуемый раздел.
Иерархическая структура дает возможность легко разрешить еще одну проблему. На сегодняшний день если пользователю требуется не весь документ, а лишь его часть, все равно приходится копировать по сети целый файл. Несмотря на то что HTML позволяет отметить маркером позицию внутри текста, определить, где заканчивается раздел, невозможно. Если же при этом строго соблюдается вложенность элементов, копирование одного раздела становится вполне реальной задачей. Именно для ее решения предназначена спецификация XML Pointer Language, или Xpointer, регламентирующая порядок адресации фрагментов XML-документа.
Итак, потенциальные возможности налицо. Осталось только реализовать их.
Структура на экране
Написать простой XML-документ совсем несложно, с этим справится даже начинающий. А для тех, кто абсолютно ничего не знает о XML, в Internet опубликовано множество учебных пособий, одно из которых обещает обучить этому языку всего за 11 с половиной минут. Приблизительно столько времени и нужно новичку для того, чтобы на его компьютере появился файл, содержимое которого выглядит примерно как на следующме примере:
<?xml version="1.0"?> <OS> <UNIX> <BSD> <Name>FreeBSD</Name> <Platform>Platform: PC and oth.</Platform> </BSD> <SunOS> <Name>SunOS</Name> <Platform>Platform: Sun</Platform> </SunOS> </UNIX> <Win95> <Name>Windows 95</Name> <Platform>Platform: PC</Platform> </Win95> </OS>
Но, помимо способности описывать данные, XML должен "уметь" отображать их, в противном случае о применении в Web не может быть и речи. На первый взгляд совершенно непонятно, в каком виде документ будет выведен на экран. Напрямую об этом не говорится ни в одном из руководств, а мимоходом брошенные фразы часто ускользают от внимания.
Что же делать с документом? Ведь в нем нет даже намека на форматирование. Смешно предполагать, что броузер сможет угадать, в каком виде автор хотел бы представить свое произведение на экране, однако трудно удержаться от соблазна тут же открыть его в одном из поддерживающих XML броузеров, благо, их становится все больше. Для первого эксперимента вполне подойдет Internet Explorer 5.0 или более поздняя версия.
Итак, документ открыт, и перед глазами предстает довольно неожиданная картина. Естественно было бы ожидать презрительного сообщения об ошибке, но вместо этого воспроизводится структура документа (рис. 1): соблюдена иерархия объектов; щелкнув на символе "--", можно свернуть часть документа, а на знаке "+" -- отобразить ее снова.
Результат, конечно, впечатляет, хотя назвать его полноценной Web-страницей можно с трудом. Структура на экране вряд ли привлечет посетителя. Без форматирования все же не обойтись.
Таблицы стилей
Чтобы получить на экране пристойный результат, надо вспомнить о каскадных
таблицах стилей (CSS), которые часто используются разработчиками HTML-документов.
Для форматирования документа достаточно связать с ним CSS-файл, определив стиль
для каждого элемента (листинг 2).
OS { display: block; text-align: left; font-size: 16pt; } Name, Platform { display: block; } Platform { font-size: 12pt; }
Теперь результат достигнут. На экране отображается полноценный документ, но созданный уже не на HTML, а на XML (рис. 2).
На первый взгляд кажется, что XML не позволяет сделать ничего такого, чего нельзя было бы добиться с помощью средств HTML и CSS. Более того, если в HTML выбор представления всех элементов можно оставить на усмотрение броузера, то при построении XML-документа приходится самостоятельно продумывать формат каждого. Безусловно, это требует усилий и времени, зато потом преимущества XML становятся очевидными.
В XML-документе описание данных полностью отделено от описания формата. Именно это свойство XML доставляет множество неприятностей начинающему. Учитывая, что XML-документ имеет строгую древовидную структуру, можно представить себе, какие богатые возможности получает Web-дизайнер. Предположим, что разработчик решил выделить сведения о своей любимой системе (конечно же Unix) красным цветом. Для этого надо добавить всего одну строку в CSS-файл:
UNIX { color: red }
Как видите, файл с описанием данных редактировать не надо. В HTML для этого потребовалось бы проанализировать код документа, найти нужные абзацы (заметьте, что размеры реального файла обычно не ограничиваются десятком строк) и включить в исходный текст новые дескрипторы. А если в дальнейшем разработчик решил бы отобразить заголовки каким-нибудь другим цветом (например, зеленым), он почти наверняка запутался бы в HTML-коде. При работе же с XML требуемые действия по-прежнему тривиальны.
Казалось бы, использование CSS решает проблему с отображением XML-документов, однако при внимательном рассмотрении приходится признать, что CSS не позволяет полностью раскрыть потенциальные возможности XML.
Представьте себе, что, экспериментируя с визуализацией документа, разработчик решил несколько уменьшить размер шрифта, которым отображаются заголовки для BSD и SunOS (действительно, ведь это лишь различные клоны одной системы), и объединить их в одном подразделе (например, "UNIX"). Но если отредактировать стиль элемента Name, уменьшится и заголовок для Win95, что противоречит первоначальному плану. Чтобы такое преобразование стало возможным, правила форматирования текста должны быть контекстно-зависимыми. Надо, чтобы Name выводился по-разному исходя из принадлежности к родительскому элементу.
Глядя на XML-файл, текст которого приведен в начале статьи, можно заметить, что в каждом из элементов Platform повторяется слово Platform:. Было бы разумным вовсе исключить это слово из исходного текста и отображать его в процессе форматирования.
После некоторых размышлений приходится констатировать, что выразительные средства каскадных таблиц стилей не позволяют решить ни первую, ни вторую задачи. И если при переходе от CSS1 к CSS2 и появляется возможность распознавать контекст, то для вставки текста на этапе форматирования требуются гораздо более мощные средства. Вероятно, к такому же выводу пришли и разработчики XML, поскольку результатом их деятельности стала спецификация нового языка для форматирования и преобразования XML-документов. Этот язык получил название XSL (eXtensible Style Language).
Шаг за горизонт: XSL
Жизнь полна неожиданностей. Приступив к изучению XML, Web-мастер вынужден вспомнить (или изучить заново) CSS, затем выясняется, что для того чтобы двигаться дальше, надо разобраться в возможностях XSL, которые выходят далеко за рамки использования XML в Web. Действительно, средства XSL позволяют не только форматировать, но и конвертировать XML-документ, представляя его практически в любом виде: от форматов, используемых для описания текста (PDF, PostScript, SGML, TeX), до звуковых и графических файлов.
Но того, кто захочет создать реальный XML-документ и разместить его на сервере (конечно же, используя XSL), подстерегает очередная проблема. Дело в том, что многие используемые в настоящее время броузеры далеко не "единодушны" в интерпретации XML, а некоторые и вовсе не поддерживают этот язык. Ситуация усложняется и тем, что спецификация XSL все еще довольно часто подвергается изменениям.
Как же поступить? Наверное, стоит вспомнить о том, что XSL позволяет преобразовывать форматы почти без ограничений и выбрать из них такой, какой лучше всего обрабатывался бы броузерами, то есть... старый добрый HTML. Для этой цели воспользуемся следующим XSL-описанием:
<?xml version="1.0"?> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform"> <xsl:template match="OS"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="Name"> <H2> <xsl:apply-templates/> </H2> </xsl:template> <xsl:template match="Platform"> <H4><I> <xsl:apply-templates/> </I></H4> </xsl:template> </xsl:transform>
При таком представлении стилей не составляет никакого труда выборочно настроить вид одного или нескольких элементов. Чтобы изменить уровень заголовков BSD и SunOS и объединить их в один раздел, достаточно строк, представленных на листинге 4.
А для того чтобы исключить слово Platform: из исходного текста, довольно изменить соответствующий элемент XSL-описания.
<xsl:template match="Platform"> <H4><I>Platform: <xsl:apply-templates/> </I></H4> </xsl:template>
Действительно, теперь средства публикации документа приобрели новое свойство, которого им так недоставало ранее, -- гибкость. Тем не менее нам есть о чем задуматься. Обратите внимание, что, пытаясь уйти от ограничений, накладываемых HTML, пришлось изучить XML, решить множество проблем и... снова вернуться к HTML. Замкнутый круг? Нет, так только кажется. Ведь исходный текст документа по-прежнему представлен на языке XML, в XSL-файле хранится его стилевое описание, а HTML -- лишь выходной формат, который в любой момент может быть изменен. При необходимости модифицировать документ редактируется только структурированный XML-файл, преобразуемый в HTML посредством формальной процедуры.
На поводу у капризного броузера
Итак, XML-документ и его стилевое описание в XSL-файле готовы. Осталось представить его читателю. Но как это сделать? Самое простое решение -- передать XML- и XSL-данные броузеру, предоставив ему выполнять преобразование самостоятельно. Но, как уже говорилось, большинство броузеров попросту не справятся с обработкой такого документа.
По-видимому, единственный приемлемый на сегодняшний день выход -- конвертировать XML-файл еще на сервере. Это можно сделать динамически при обращении клиента, а можно выполнять преобразование сразу после окончания работы над документом и представлять на сервере его HTML-версию. Администратор Web-узла должен решить, что ему проще: реализовывать ISAPI-фильтр, распознающий обращение к XML-файлам, или конвертировать их после каждого редактирования.
Кстати, о необходимых инструментах уже позаботились разработчики. Один из самых популярных преобразователей под названием XT, созданный Джеймсом Кларком (James Clark), может работать на различных платформах. А конвертировать документ динамически при обращении клиента к серверу позволяет XML Enabler, реализованный в виде сервлета.
Ветер перемен в Web
Какая же судьба уготована привычному всем нам языку HTML? Уступит ли он позиции конкуренту в лице XML или еще поборется за место под солнцем? Очевидно, что в самое ближайшее время HTML ничего не грозит. Большинство разработчиков Web-документов будут по-прежнему использовать именно его. Однако недостатки HTML очевидны, а XML обладает потенциальными возможностями для их ликвидации, хоть для этого и потребуется упорная работа многих специалистов. По мере же расширения поддержки нового языка XML-документы станут реально вытеснять HTML-страницы из Web. Впрочем, не исключено, что в один прекрасный день будет разработан новый язык, простой и в то же время гибкий, который решительным жестом заставит потесниться как HTML, так и XML. Подобных примеров в истории информационных технологий уже было немало.
<xsl:template match="UNIX"> <H2>UNIX</H2> <xsl:apply-templates/> </xsl:template> <xsl:template match="BSD/child::Name"> <H3> <xsl:apply-templates/> </H3> </xsl:template> <xsl:template match="SunOS/child::Name"> <H3> <xsl:apply-templates/> </H3> </xsl:template>