XSL: путь к элегантности

Нейл Рэндалл,
внештатный редактор PC Magazine,
автор книги The Soul of the Internet (ITCP)

Введение
Основы XSL
Шаблонные правила
Шаблоны и объекты форматирования
XSL в действии
Современное состояние XSL
Пространство имен XML

Введение

Каким бы великолепным ни было содержание документа, важную роль играет и его оформление. Ярким примером тому служит Web. Не секрет, что на некоторых узлах Web применяются лишь те стили, которые «дозволяют» основные теги HTML. Но и здесь наблюдается тенденция к унификации их стилевых элементов, сравнимая разве что со стремлением разных фирм к единообразию своих официальных документов или продукции. Попытки такой унификации привели к появлению в HTML механизма каскадных таблиц стилей (Cascading Style Sheets, CSS), в то время как SGML (Standard Generalized Markup Language - стандартный обобщенный язык разметки) еще раньше обзавелся языком описания семантики стиля и спецификации документа (Document Style Semantics and Specification Language, DSSSL). Именно поэтому XML (Extensible Markup Language - расширяемый язык разметки), совсем недавно пополнивший ряды языков авторской разработки для Web, тоже приобрел стилевой механизм. Расширяемый язык стилевого оформления (Extensible Style Language, XSL) - язык для форматирования XML-документов и, в частности, данных в таких документах - достиг стадии рабочего проекта консорциума World Wide Web Consortium (W3C).

По своим возможностям отображения данных XML значительно превосходит HTML, это и стало основанием для разработки XSL. XML позволяет Web-авторам проводить разметку данных с помощью авторских элементов (пар открывающих и закрывающих тегов) и с учетом специфики данных. В итоге настройка и организация структуры данных значительно лучше, чем обеспечивает HTML. Но для полной доходчивости информации, охваченной рамками элемента, способ его отображения должен соответствовать его назначению. Элементу необходимо придать стиль. Средствами XSL авторы без труда добьются того, чтобы данные в рамках элемента или ряда элементов отображались определенным образом. Такие данные принимают одну или несколько стилевых черт.

Может ли XSL заменить CSS? Нет. В действительности они работают в паре. CSS хорошо приспособлен для HTML-документов, поскольку позволяет применять атрибуты стиля для целого документа или комплекта документов. XSL больше подходит для документов, полученных из наборов данных, в этом он схож с языком XML. Элементы данных можно отображать, не меняя их разметки, в разных местах одного документа или в ряде документов. С помощью XML данные помещаются в нужное место, а средствами XSL эта область оформляется сообразно своему назначению. Попросту говоря, XSL обеспечивает более сложные возможности форматирования, чем CSS. Тем не менее для согласованного оформления страницы и данных в наиболее сложных проектах будут использоваться оба метода.

Языки XSL и CSS можно применять в паре, поскольку такое свойство присуще и XSL с HTML. XSL таит в себе два важных преимущества: во-первых, он позволяет извлекать конкретные данные из XML-документа, во-вторых - форматировать их. Однако, если есть желание, можно извлекать данные с помощью XSL, а для их стилевого оформления воспользоваться HTML. Предположим, имеется XML-документ для отслеживания матчей лучших бейсболистов высшей лиги за последние 100 лет, а в нем, скорее всего, есть XML-элемент team (он обозначается как ) с именами игроков команд. Для того чтобы в окончательном HTML-документе название команды выводилось полужирным курсивом, следовало бы средствами XSL подготовить предложения для поиска всех экземпляров элемента team и вывода их на экран после размещения между HTML-тегами и .

Примечание. Терминология и концепции, принятые в данной статье, позаимствованы из рабочего проекта спецификации XSL 1.0 (www.w3.org/tr/wd-xsl). Этот проект существенно отличается от более ранних вариантов XSL. Одно из его отличий - правило конструирования (construction rule) - заменено шаблонным правилом (template rule). Вследствие этого произошла замена таких фундаментальных тегов, как , и замена ключевого слова action на template. Тем, кто успел освоить оригинальную версию XSL, стоит ознакомиться и с новым проектом.

Основы XSL

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

Процесс форматирования данных в XSL состоит из двух основных этапов. На первом формируется исходное дерево (source tree) путем приведения в соответствие XML-элементам заданных образцов (patterns). После обработки этого дерева, согласно действиям, определенным в шаблонных правилах (о них рассказывается ниже), образуется конечное дерево (results tree). Затем синтаксический анализатор XML с учетом XML-данных и XSL-инструкций по форматированию преобразует конечное дерево в HTML-документ для отображения на ПК клиента Web. XSL содержит средства для переупорядочения данных, поэтому конечное дерево может кардинально отличаться от исходного.

Другими словами, работа начинается с XML-документа. В нем есть элементы, содержащие данные. Средствами XSL отыскиваются эти элементы и строится исходное дерево. Затем для получения конечного дерева, в котором каждому элементу назначен свой стиль, применяются шаблонные правила. Наконец, XSL-процессор транслирует отформатированные элементы в HTML-текст, чтобы Web-браузер мог вывести его на экран. Источником данных служит XML-документ, а элементов форматирования, которые могут предусматривать изменение структуры, - таблица стилей XSL.

В действительности HTML - не единственный выходной формат. XSL не зависит от языка отображения, поэтому можно разработать синтаксический анализатор XSL, который будет формировать файлы других форматов, таких, как RTF, форматы конкретных текстовых редакторов или даже специализированные форматы, например PDF фирмы Adobe. Однако в таких программах, как Office 2000, если верить наблюдающимся тенденциям, HTML играет роль стандартного формата документов, а если учесть и тот факт, что XML разрабатывается в первую очередь для Web-приложений, можно прогнозировать, что в обозримом будущем наиболее вероятным языком для преобразования будет HTML.

Шаблонные правила

Основа XSL - шаблонное правило (template rule), в котором определяется, как будет выглядеть оригинальный XML-элемент в выходном документе. Каждое правило состоит из образца (pattern) и шаблона. Образец содержит в себе имена узлов элементов (node) исходного дерева (т. е. индивидуальных элементов), к которым будут применяться правила конструирования. В шаблоне указывается, какой обработке подвергнется образец для формирования соответствующей части конечного дерева. По существу шаблонное правило гласит: «Найти надлежащие узлы элементов, упорядочить их, как указано, отформатировать и поместить в конечное дерево, чтобы их можно было передать синтаксическому анализатору». Если рассматривать исходный XML-документ как сырой материал, а конечный HTML-документ как окончательный продукт, правило конструирования представляет собой что-то вроде производственного процесса. В сущности, по этим правилам необработанные данные XML преобразуются в пригодную для восприятия информацию.

Образцы - это строки, которые соответствуют именам элементов в XML-документе. В них указаны элементы, к которым нужно применить шаблон. Например, если бы XML-документ был подготовлен для каталога журналов, он бы мог начинаться с элемента , а в следующем за ним фрагменте, возможно, присутствовал бы элемент . Если нужно применить стилевое оформление ко всем данным в элементе , следует сформулировать на языке XSL задание на поиск образца magazine_type с последующей обработкой его по шаблону и добавлением результата в конечное дерево. Такое первичное (basic) совпадение с образцом обозначается ключевым словом match в элементе template, например так:

match="magazine_type">

С помощью XSL можно находить простые совпадения, например с названием элемента, или искать совпадения по происхождению (ancestry) для обнаружения элементов-потомков (child) (названия элементов, вложенные в названия других элементов) любого уровня. Скажем, следующий элемент шаблона

"platform"/"magazine_name">

предназначен для поиска элементов с названием magazine_name в разделе «platform» раздела «magazine type» XML-документа.

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

Шаблоны и фрагменты форматирования

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

В XSL-шаблоне указывается, какие объекты форматирования (formatting objects) применяются к определенным образцам. К объектам форматирования относятся элементы стиля, такие, как особенности начертания шрифта, затенение текста, цвет фона и интервалы, а также виды блоков, например текстовые блоки и графика. В XSL имеется гигантское число объектов форматирования, все они входят в его оформительский словарь и, в конце концов, вольются в словари CSS и DSSSL. Поскольку одно из назначений системы объектов форматирования - обеспечить XSL возможность вывода не только на экран, но и на принтеры, описание этой системы составляет самую объемную часть спецификации XSL. Очевидно, данная система предвосхищает появление программ форматирования, подобных пакетам настольных издательских систем (или даже входящих в их состав). Однако в их отсутствие спецификация будет обеспечивать необходимые базовые функции для применения таких элементов форматирования, как номера страниц, выделенные рамки и многое другое.

Форматирующая часть шаблона предназначена для создания на конечном дереве объектов для форматирования, а затем выполнения этой процедуры. Подобный объект может относиться к одному из нескольких типов, начиная с объектов макета (layout objects) - они определяют основной стиль страницы или последовательности страниц - и кончая математическими объектами (math objects), применяемыми для представления уравнений (в рабочий проект не входят), и табличными объектами (table objects) для показа таблиц (также отсутствуют в рабочем проекте). Однако чаще всего формируемые объекты - это потоковые объекты (flow objects). Их функции могут быть самыми разными: от простого построения текстовых блоков до более сложных указаний, как группировать потоковые объекты, чтобы применять к ним типовые средства форматирования. Последний тип - потоковый объект последовательности (sequence) - используется весьма широко, поскольку дает возможность применять стандартные средства форматирования к последовательности данных в рамках указанного именованного элемента в XML-документе.

В XSL-шаблонах записаны инструкции по операциям форматирования, начиная с нумерации элементов в списке до определенных условий выполнения этих операций. Однако с помощью наиболее распространенной инструкции xsl:process пользователь информирует XSL о том, что указанное форматирование следует применить либо ко всем потомкам именованного элемента (xsl:process-children), либо только к конкретному потомку (xsl:process). На самом деле инструкция xsl:process-children используется чаще всех остальных инструкций XSL.

Одна из наиболее ценных особенностей XSL - возможность исключительно селективно отбирать данные для форматирования. Во-первых, инструкция xsl:process select позволяет указать, какие именно потомки подлежат форматированию. А для более точного отбора информации имеется два условных оператора - xsl:if и xsl:choose. Первый подразумевает поиск образца в XSL-элементах, и для каждого найденного совпадения выполняются инструкции (либо не выполняются, если совпадений не обнаружено). Второй оператор (xsl:choose) состоит из одного или нескольких предложений с ключевым словом when, а форматированию подлежит первый найденный элемент, соответствующий условию в предложении when.

Если совпадений не найдено, проводится поиск необязательного предложения otherwise и выполняются инструкции, связанные с этим предложением. Другими словами, XSL обеспечивает ограниченные возможности программирования в рамках структуры шаблона и по сути дела систему подготовки макрокоманд для улучшенного программирования деталей форматирования. На рис. 1 приведен пример некоторых элементов программирования, имеющихся в XML Styler, программе формирования и редактирования документов фирмы Arbortext.

XSL в действии

Как все это работает? Здесь нам не удастся рассмотреть не только все особенности XSL, но и даже ограниченное число упомянутых в данной статье функций. Однако приведем пару примеров, показывающих, как сделать выводимую Web-браузером информацию более понятной и полезной.

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

"platform"/"magazine_name">

С этого шаблона начинается процедура обработки потомков всех элементов magazine_name, найденных в XML-документе. По существу он гласит следующее: «Найти в данном документе элементы с именем magazine_name (которые представляют собой элементы-потомки ряда других элементов) и извлечь по одному данные, связанные с этими элементами (названия журналов). При выводе на экран каждой порции таких данных оформить их полужирным шрифтом». Другими словами, следует перейти к первому названию журнала (скажем, к PC Magazine), выделить его полужирным шрифтом, а затем проделать то же самое с названиями всех остальных журналов. В результате получится список названий журналов, выполненный полужирным шрифтом.

 рис. 2. Стилевая таблица XSL с тремя шаблонными правилами.

 
    
       
    
 
 
    
       
    
 
 
    
       
    
 

На рис. 2 показан более сложный пример применения XSL. (Заметим, что в данном примере отсутствуют некоторые обязательные элементы, которые должны появляться в паре с открывающим тегом xsl:stylesheet.)

Здесь представлена таблица стилей XSL, как указано в начальном и конечном тегах xsl:stylesheet, между которыми находятся элементы. В пределах этой таблицы стилей есть три шаблона, каждый со своими начальным и конечным элементами xsl:template.

Инструкции первого шаблона относятся к корневому узлу (уровню) XML-документа. Поскольку корневой узел только один, а все остальные узлы вложены в него, форматирование будет проводиться для всего документа. В данном случае это объект форматирования последовательности страниц со шрифтом определенного семейства и размера. Таким образом будут отформатированы все страницы. Другими словами, это что-то вроде основной форматирующей инструкции, но, как и в случае с любым шаблонным правилом XSL, ее действие будет отменено любым более конкретным шаблоном, т. е. таким, который требует совпадения с любым потомком корневого узла.

Второе шаблонное правило указывает необходимость применения обычного стиля шрифта кеглем 12 пунктов ко всем данным элемента magazine_type и всем его потомкам. Заметим, что при этом меняется размер шрифта, заданный первым шаблоном (16 пунктов) для любых данных, извлеченных из данного элемента, поскольку элемент magazine_type конкретнее (расположен глубже в иерархии предок-потомок), чем корневой элемент.

Третий шаблон отличается тем, что предусматривает требование о совпадении с образцом по элементу magazine, но следует обратить внимание на то, что присутствует инструкция process select, а не process-children. Атрибут // означает, что форматирование коснется элемента magazine_name, независимо от уровня вложенности его в элементе magazine. Поскольку в нашем XML-документе элемент magazine таит в себе данные о журналах разных типов (о компьютерах, о моде, о спорте), согласно этой инструкции, названия всех журналов будут выводиться полужирным шрифтом. Другими словами, синтаксический анализатор XSL отыщет все элементы magazine_name и обработает их подобным образом. Применяя инструкцию process select, можно отделить общее форматирование, выполняемое с помощью инструкции process-children, и форматирование, необходимое только для элементов одного типа. Другими словами, для форматирования всего, что находится на уровнях ниже текущего узла, можно применять инструкцию process-children, а для форматирования по-особому элементов в рамках данной инструкции следует выбирать process select.

Современное состояние XSL

XSL, как, впрочем, и XML, ждет потенциально блестящее будущее. Однако, прежде чем XSL приобретет статус широко применяемого стандарта, пройдет какое-то время. У нас уже есть язык стилевого оформления для Web (CSS версий 1 и 2), и разработчики узлов все еще находятся в процессе поиска наилучших способов реализации его возможностей. Разработчики некоторых узлов применяют этот язык, но многие пока воздерживаются от этого. Одна из причин отказа от него заключается в том, что только версии 4 браузеров IE и Navigator «воспринимают» его полностью, а немалый процент пользователей по-прежнему располагает более ранними версиями.

Тим Брей (Tim Bray), ведущий автор спецификаций XML, подробно рассматривает эти вопросы в своей публикации (www.xml.com/xml/pub/98/10/ie5-2.html). По его мнению, спецификацию CSS следует «довести до ума», чтобы Web-клиенты могли воспользоваться всеми возможностями CSS1 и CSS2, а потом уже приступать к реализации XSL. На момент подготовки данной статьи ситуация была такова: спецификации XSL существовали только в виде рабочего проекта, поэтому в окончательных рекомендациях, вероятно, неизбежны многочисленные изменения. Однако, как бы то ни было, наверное, не стоит сомневаться, что XSL становится важным инструментом для Web (и для других компьютерных приложений) и сейчас самое время приступить к его изучению.

Пространство имен XML

В условиях, когда число XML-документов растет, особенно когда ими занимается несколько авторов, названия элементов и атрибутов могут использоваться многократно. Например, смысл элемента под названием <title>, весьма вероятно, будет меняться от одного документа к другому. Для того чтобы синтаксический анализатор XML «улавливал» разницу между конфликтующими элементами в сообществе XML, разработана концепция пространства имен XML.

Эта концепция обеспечивает простой и универсальный способ отделения идентично названных элементов или атрибутов друг от друга. Отличительный признак — URL, ассоциированный с названием. Здесь показан пример объявления пространства имен: <xmlns:xsl=’http://www.mycompany.com/xml/schema’>. В данном объявлении, помещенном ближе к началу документа, программе, которая будет выводить его на экран (например, IE5), сообщается, что все элементы, начинающиеся с xsl, следует форматировать в соответствии с документом schema, находящимся по указанному адресу URL. В XML-документе под названием schema оговаривается, как обрабатывать теги и формировать ссылки на них, чтобы уменьшить число инструкций в текущем документе.

В приведенном выше примере показан URL по умолчанию для всех XSL-элементов или атрибутов. Для решения перспективных задач можно указывать URL для имен отдельных элементов или атрибутов, чтобы в разных частях документа применялись разные схемы. К примеру, можно объявить, что префикс abc относится к схеме, размещенной по конкретному URL, затем пометить этим префиксом название каждого элемента или атрибута, чтобы получить информацию, необходимую на этапе обработки, по этому адресу. Скажем, если составить выражение <xmlns:abc=’http://www.yourcompany.com/formats/xml’>, затем в тексте документа <abc:title>Король Лир</abc:title>, то программа отображения отформатирует заголовок в соответствии со схемой по адресу URL, имеющемуся в объявлении префикса.

Универсальность такого подхода заключается в том, что кто угодно может ссылаться на один и тот же URL, что позволяет повторно использовать схемы, следовательно, и экономить время разработки. Рабочий проект реализации пространства имен XML размещен по адресу www.w3.org/tr/1999/rec-xml-names-19990114


Источник публикации: http://www.pcmag.ru/ №10, 1999