ТАБЛИЦЫ СТИЛЕЙ
До сих пор при обсуждении XML я обходил стороной два важных вопроса. Первый из них касается того, как именно должны форматироваться элементы XML. (Вы наверняка пытались, но тщетно, найти инструкции по форматированию в приводимых фрагментах кода.) Второй же связан с тем, как браузеры смогут понимать нестандартные теги типа <publication>.
Ответ лежит в использовании таблиц стилей. Пользующиеся умеренной популярностью в Web каскадируемые таблицы стилей (Cascading Style Sheet, CSS) позволяют изменять форматирование известных тегов HTML и определять новые теги. В частности, на Web-сервере Network Magazine таблицы стилей CSS используются для стандартизации представления типичных элементов, таких, как <H1>, и для введения новых, таких, как врезки.
CSS могут служить и для форматирования документов XML, но это не очень удачный выбор. Главное достоинство XML в том, что он представляет формат документа, для возможных манипуляций, в виде древовидной структуры. К сожалению, CSS не способны взаимодействовать с деревом и могут только форматировать документы XML «как они есть». Вы можете вывести документ на экран в любом приглянувшемся формате, но не можете осуществить какое-либо избирательное представление его данных без применения языка сценариев. Более того, для использования CSS вам придется изучить еще один синтаксис.
Данные ограничения привели к созданию XSL. Это приложение XML со своей собственной семантикой (фиксированным набором элементов), следовательно, оно может быть использовано для создания таблиц стилей (шаблонов документов), понятных любой программе разбора XML.
Таблицы стилей XSL описывают, как документы XML должны преобразовываться в другие форматы, такие, как HTML или RTF. Но таблицы стилей XML — это нечто большее, чем просто преобразователи форматов; они также предоставляют механизм для манипулирования данными. Например, данные можно сортировать, производить по ним поиск, удалять или добавлять прямо из браузера.
Давайте рассмотрим какую-либо простую таблицу стилей, которой мы могли бы воспользоваться для представленного ранее приложения Editor Contacts.
<?xml version = “1.0” ?> <xsl:stylesheet xmlns:xsl=“http://www.w3.org/TR/WD-xsl”> <!–декларация, что документ является таблицей стилей и что он связан с xsl: namespace –> <xsl:template match=”/”> <!–Применить шаблон ко всему в исходном документе XML –> <HTML> <BODY> <H1>Editor Contacts</H1> <xsl:for-each select=”editor_contacts/editor”> <H2>Name: <xsl:value-of select=”first_name”> <xsl:value-of select=”last_name”/></H2> <P>Title: <xsl:value-of select=“title”/></P> <P>Publication: <xsl:value-of select=”publication”/></P> <P>Street Address: <xsl:value-of select=”address/street”/></P> <P>City: <xsl:value-of select=”address/city”/></P> <P>State: <xsl:value-of select=”address/state”/></P> <P>Zip: <xsl:value-of select=”address/zip”/></P> <P>E-Mail: <xsl:value-of select=”e_mail”/></P> </xsl:for-each> </BODY> </HTML> </xsl:template> </xsl:stylesheet>
При сохранении на диск под именем EDITORS.XSL (или любым другим) этот шаблон будет применен к EDITORS.XML при добавлении в него следующей строки после первой:
<?xml-stylesheet type=”text/xsl” href= “editors.xsl” ?>
В конечном итоге текст на экране браузера будет выглядеть точно так же, как представленный ранее фрагмент HTML. Однако XSL может действовать как функция текстового процессора merge-print. Определенный как неотъемлемая часть пространства имен XSL, элемент xsl:for-each сообщает процессору о том, что он должен циклически обрабатывать все узлы в исходном файле XML. Атрибут xsl:value-of вставляет значение узла XML в элемент HTML. Таким образом, если вам придется вернуться к EDITORS.XML и вставить десятки или сотни контактных адресов, то они без каких-либо изменений будут отображаться в таблице стилей. Благодаря тому, что информацию о форматировании требуется передать только один раз, XML и XSL экономят пропускную способность. Таблицы стилей XSL имитируют функцию merge-print еще и в том, что они позволяют избирательно опускать поля данных при отображении.
Кроме того, вывод может быть отсортирован по любому конкретному полю данных. Для сортировки базы данных контактных адресов по фамилии редактора в прямом алфавитном порядке элемент xsl:for-each следует изменить следующим образом:
<xsl:for-each select= “editor_contacts/editor” order-by=”+last_name”>
XSL способен также осуществлять условную трансформацию вывода в зависимости от значений различных элементов или атрибутов. Более того, он позволяет запрашивать данные с использованием множества разнообразных операторов шаблонов, символов подстановки, фильтров, булевых операторов и выражений множества. XML и XSL никоим образом не предназначены для замены SQL, к тому же вряд ли найдется много желающих хранить свои базы данных непосредственно в формате XML. Однако XSL открывает возможность разнообразного поиска по данным после их загрузки в браузер. Вам никогда уже не понадобится использовать для поиска информации примитивную встроенную команду браузера Find.
Значительный потенциал XML в качестве промежуточного программного обеспечения подкрепляется объектной моделью документа (Document Object Model, DOM), версия 1.0 которого была принята в качестве рекомендации W3C в октябре 1998 года. DOM возникла как спецификация для обеспечения переносимости сценариев JavaScript и программ на Java между браузерами Web и позднее эволюционировала в API для документов HTML и XML. Она определяет логическую структуру документов, способы доступа и манипулирования ими. Программисты могут создавать документы, управлять их структурой и добавлять, модифицировать или удалять элементы и содержимое.
DOM не оказывает никакого влияния на то, как следует писать документы XML и HTML. Вместо определения набора структур данных она представляет документы в соответствии с объектной моделью, такой, как древовидная структура, состоящая из узлов. Нет никакой необходимости использовать DOM просто для просмотра документов XML из браузера. Она применяется, когда по сценарию требуется изменить документ XML или обратиться к его данным.На сервере DOM может применяться для анализа поступивших от клиента файлов XML и соответствующей реакции на них. Кроме того, программистами DOM может использоваться в качестве промежуточного уровня для преобразования из формата базы данных в XML. При правильной реализации интерфейсов DOM пользователям никогда не потребуется знать, что данные хранятся в каком-либо ином формате, а не в XML.