Язык xml стилевые таблицы xsl


Содержание

Отображение XML с использованием XSLT

При помощи XSLT вы можете преобразовывать XML документ в HTML.

XSLT (eXtensible Stylesheet Language Transformations), язык преобразования XML документов, является рекомендованным языком таблиц стилей для XML.

XSLT более сложный язык таблиц стилей, чем CSS. Используя XSLT вы можете добавлять/удалять элементы и атрибуты в конечном файле отображения. Также, вы можете реорганизовывать и сортировать элементы, осуществлять проверки и принимать решения о том, какие элементы скрывать, а какие отображать. И многое другое.

XSLT использует XPath для поиска информации в XML документе.

Пример XSLT

Будем использовать следующий XML документ:

Перед выводом в браузер используем XSLT для преобразования XML в HTML.

АйТи бубен

Инструменты пользователя

Инструменты сайта

Содержание

Введение в XML

XML — расширяемый язык разметки. Рекомендован Консорциумом Всемирной паутины. Спецификация XML описывает XML-документы и частично описывает поведение XML-процессоров.

XML (eXtensible Markup Language — расширяемый язык разметки; произносится [икс-эм-э́ль])- набор правил и соглашений о синтаксисе, с помощью которого можно создавать собственные наборы элементов разметки. Эти элементы, в свою очередь, можно использовать для описания содержимого. Своим появлением XML обязан невозможности применения HTML для описания данных самого разного рода, которые пользователи желают распространять через Web. Так, HTML практически невозможно использовать для описания финансовых данных, руководств по инсталляции программного обеспечения, математических выражений и множества данных других типов, которыми буквально наполнена сеть Интернет. Истинное назначение языка разметки XML — описывать части документа, не касаясь способов его визуализации и отображения. Разметка позволяет структурировать данные, а уже затем эти данные можно использовать по-разному.

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

Правила XML:

Интеграция XML в HTML

Визуальное представление данных XML при помощи CSS

XML документы могут быть визуально представлены при помощи таблиц стилей — Основы работы с CSS.

Для подключения стилей существует специальная инструкция xml:stylesheet

Атрибут type указывает используемый тип стилевых таблиц. При использовании таблиц стилей XSL значение атрибута type поменяется на «text/xsl». Атрибут href указывает расположение файла таблицы стилей.

XML Schema (XSD)

Альтернативу определениям DTD представляют XML схемы. XML Schema была задумана для определения правил, которым должен подчиняться документ. Схемы используют синтаксис языка XML для определения правил словаря XML документа. К достоинствам схем можно отнести расширяемость и возможность наследования, поддержку пространств имен, поддержку большего, по сравнению с DTD, количества типов данных.

После проверки документа на соответствие XML Schema, читающая программа может создать модель данных документа (словарь; модель содержания;типы данных). Каждый элемент в этой модели ассоциируется с определённым типом данных, позволяя строить в памяти объект, соответствующий структуре XML-документа. В XML схеме один словарь может ссылаться на другой, и, таким образом, разработчик может использовать уже существующие словари и легче устанавливать и распространять стандарты XML структуры для определённых задач (например, словарь протокола SOAP).

XSLT первый шаг

1. Введение

Не прошло и трёх лет с тех пор, как у меня зародилась мысль о том, что пора изучать 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.

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

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

  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. Все элементы (тэги) должны иметь закрывающую часть (
    ,

).

  • Атрибуты всегда имеют значение, которое обязательно указывается в кавычках (одинарных или двойных). Например, «radio» disabled= «disabled» /> .
  • Управляющие символы & , и > всегда должны маскироваться. Например, «?a=1&b=2» > & . Исключение составляет только , внутри которого спецсимволы можно не маскировать.
  • Также сам XHTML обязывает выполнять следующие условия:

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

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

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

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

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

    Объявление типа документа и его схемы.

    Для XHTML 1.0 есть три типа — Strict (строгое соответствие рекомендациям W3C), Transitional (переходный тип) и Frameset (использование фреймов). Для каждого из них предусмотрен отдельный DTD.

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

    Очень важно указывать ссылку именно в таком регистре и никак иначе. Это связано с тем, что в XML имена элементов и содержимое их атрибутов регистрозависимы.

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

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

    Помимо XHTML1.0 на данный момент доступен XHTML1.1:

    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-документ и подключить к нему этот стиль:

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

    Если файлы text.xml и test.xsl созданы и находятся в одной папке, то с помощью любого XSLT-парсера можно преобразовать исходный test.xml в результирующий документ. В качестве парсера могут выступать все популярные браузеры (IE5+, FF2+, Opera9+ и другие), а также модули в языках программирования, например, в PHP. Если вы используете браузер, то достаточно открыть test.xml, и он сразу отобразит примерно такой результат:

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

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

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

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

    Документ сформирован в кодировке windows-1251, о чём сообщается в атрибуте encoding. Версию XML-документа желательно всегда указывать, это рекомендация W3C.

    Затем идёт объявление корневого элемента, стиля:

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

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

    • 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 будут подставлены в заголовок страницы ( . ) посредством метатега.

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

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

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

    Формирование XHTML-страницы. Оно начинается с элемента , у которого указано пространство имён xhtml:

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

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

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

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

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

    Текст «Мой список:» будет подставлен в тег

    Организация цикла по выборке:

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

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

    В данном случае проверяется на чётность позиция элемента в списке выборки. Если тест возвращает true (порядковый номер элемента чётный), то срабатывает содержимое этого элемента.

    Управление атрибутами вышестоящего элемента:

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

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

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

    Вывод ссылки на разработчика парсера XSLT:

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

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

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

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

    IE 6 FireFox 3 Opera 9.02

    4. Приложение

    Ссылки на исходный код

    Постоянный адрес статьи //anton-pribora.ru/articles/xml/xslt-first-step/. /Автор: Прибора Антон Николаевич, 2009 год/

    Использование PHP5 для обработки XSLT

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

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

    Мысли вслух

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

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

    Отображение XML-документов с использованием XSL-таблиц стилей

    В этой лекции вы познакомитесь с последним из рассматриваемых в этом курсе методов отображения XML -документов в браузере Microsoft Internet Explorer 5 – расширяемым языком таблиц стилей XSL ( Extensible Stylesheet Language ). Подобно таблице каскадных стилей ( CSS ), рассмотренной в «Отображение XML-документов с использованием таблиц каскадных стилей» , XSL — таблица стилей связывается с XML -документом и сообщает браузеру, как отображать данные XML . Это позволяет вам открывать XML -документ непосредственно в браузере без посредничества HTML -страницы.

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

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

    Однако XSL -таблицы являются более сложными для понимания, чем CSS -таблицы. Работа с ними требует знания языка HTML . Кроме того, это новая технология, поэтому имеет меньшую степень поддержки – меньшую степень унификации среди современных браузеров.

    Ссылка. Эта лекция знакомит с основами XSL . Вы можете узнать больше об этой мощной, развивающейся технологии XML, обратившись к официальным спецификациям XSL , которые можно найти на Web-страницах, предоставленных консорциумом World W >XSL ) Version 1.0″ по адресу http://www.w3.org/TR/WD-xsl и » XSL Transformations ( XSLT ) Version 1.0″по адресу http://www.w3.org/TR/WD-xslt. Чтобы подробнее узнать о поддержке XSL в Internet Explorer 5, обратитесь к следующим Web-страницам, предоставленным Microsoft Developer Network (MSDN): » XSL Developer’s Gu >XSL Reference» по адресу http://msdn.microsoft.com/xml/reference/xsl/start.asp.

    Основы использования XSL-таблиц стилей

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

    1. Создание файла XSL-таблицы стилей. XSL является приложением XML, т. е. XSL -таблица представляет собой корректно сформированный XML-документ, который отвечает правилам XSL . Подобно любому XML-документу, XSL -таблица стилей содержит простой текст, и вы можете создать ее с помощью вашего любимого текстового редактора. В последующих разделах рассказывается, как создавать различные типы XSL -таблиц стилей.
    2. Связывание XSL-таблицы стилей с XML-документом. Вы можете связать XSL -таблицу стилей с XML-документом, включив в документ инструкцию по обработке xml-stylesheet , которая имеет следующую обобщенную форму записи:

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

    Чаще используют неполный URL, который задает местонахождение относительно месторасположения XML-документа, содержащего инструкцию по обработке xml-stylesheet , например:

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

    Подсказка. Хотя вы и можете связать XSL -таблицу стилей с использованием полного URL, таблица стилей при этом должна размещаться на том же домене, что и XML-документ, с которым вы ее связываете. Например, если домен http://mspress.microsoft.com/ содержит XML-документ, то и XSL -таблица стилей должна размещаться на том же домене.

    Обычно инструкция по обработке xml-stylesheet добавляется в пролог XML-документа вслед за объявлением XML, как вы увидите в примере XML-документа, рассматриваемого в следующем разделе (см. Листинг 10.2). Более подробная информация об инструкциях по обработке и описании мест в документе, куда они могут быть корректно помещены, содержится в разделе «Использование инструкций по обработке» в «Добавление комментариев, инструкций по обработке и разделов CDATA» .

    Если вы связали XSL -таблицу стилей с XML-документом, вы можете открыть этот документ непосредственно в Internet Explorer 5, и браузер отобразит XML-документ с использованием инструкций по преобразованию, содержащихся в таблице стилей. В отличие от таблиц каскадных стилей, если вы связываете с XML-документом более одной XSL -таблицы стилей, браузер использует первую таблицу и игнорирует все остальные. Если вы свяжете с XML-документом и CSS-таблицу и XSL -таблицу стилей, браузер использует только XSL -таблицу стилей.

    Примечание. Если вы не связали XML-документ ни с CSS-таблицей, ни с XSL -таблицей стилей, Internet Explorer 5 отобразит документ с помощью встроенной XSL -таблицы, которая используется по умолчанию. Эта таблица стилей отображает исходный XML-текст в виде дерева с возможностью свертывания/развертывания уровней (см. раздел «Отобразите XML-документ без таблицы стиля» в «Создание и отображение вашего первого XML-документа» .

    Язык xml стилевые таблицы xsl

    Что же такое вообще язык разметки?

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

    Они выделяются относительно основного содержимого документа и служат в качестве инструкций для программы, производящей показ содержимого документа на стороне клиента. В самых первых системах для обозначения этих команд использовались символы открывающаяся и закрывающаяся угловая скобки( “ ”), внутри которых помещались названия инструкций и их параметры. Сейчас такой способ обозначения тегов является стандартным.

    В 1969 г под руководством сотрудника IBM Чарльза Голдфарба был создан первый язык разметки документов Generalized Markup Language (GML).

    В нём была реализована концепция типа документа и вложенных друг в друга структур.

    Тип документа — формально определенного шаблона, описывающего схему внутреннего построения схожих документов

    В 1978 г был разработан SGML (Standard General Markup Language). В его основу был заложен GML. Основанный на языке GML, он позволил отказаться от конкретных способов представления информации и сосредоточить усилия на продумывании структуры документов с помощью правил определения собственных тегов форматирования, их атрибутов и синтаксиса использования. В рамках SGML была изобретена концепция DTD (Document Type Definition) – определение типа документа. Она позволила связать конкретные синтаксические правила разбора с заданными способами организации структуры документов.

    В 1989 г SGML расширился стандартизованной ISO таблицей стилей DSSSL, позволившей дополнять описания структуры SGML-документа независимыми от платформы способами его представления на экране.

    В конце 90-х годов быстро набрал популярность новый язык разметки – XML( Extensible Markup Language ). Он представляет собой упрощенный вариант SGML и также позволяет создавать пользовательские XML-приложения. Очень важной оказалась возможность создания в XHTML-приложении собственных тегов.

    26 января 2000 г вышла спецификация нового языка разметки XHTML 1.0. Разработчики дополнительно получили три DTD-документа для описания типов, определяемых требованиями HTML 4, поэтому теперь можно обрабатывать XHTML-файлы с помощью практически любых XML-анализаторов.

    В феврале 2002 г была опубликована предварительная рекомендация стандарта XML 1.1.

    Стало допустимым использовать произвольные кодировки символов в названиях элементов, удалось уйти от проблем с представлением символов перевода строки в разных операционных системах.

    2. Эволюция языков разметки

    Здесь показана эволюция языков разметки. Из SGML , созданном на основе самого первого языка разметки GML , вышел язык XML .

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

    Из XML и HTML вышел XHTML , он был назван «переформулировкой HTML 4.0 в виде приложения XML 1.0».

    XSL/T (Extensible Stylesheet Language /Transformations)

    Как и в случае с xml, который не является заменой html (как думают некоторые), так и XSL — это не замена css. Рассмотрим основные положения XSL:

    • Стилевая технология, предназначенная для трансформации XML-документов в другие форматы.
    • Таблицы стилей XSL создаются по правилам XML-документов.
    • Таблицы стилей XSL состоят из набора шаблонов.
    • XSLT-преобразования можно проводить на стороне сервера (средствами PHP).
    • Такие преобразования поддерживаются только если подключен модуль XSL (php_xsl.dll).


    На практике мы может так же применить xsl-файл к xml-документу, как и css:

    Произошла xsl-трансформация xml-документа. А процессором, который произвел это, стал браузер. Т.е. он взял xsl, xml-файлы и трансформировал.

    Структура xsl-файла

    Сам по себе xsl-файл по структуре – копия xml-файла. Это те же кирпичики-элементы. Первой строкой говорим, что это xml-файл. У него есть корневой элемент stylesheet. Внутри него описываются шаблоны с помощью элементов template. А атрибуты match говорят о том, к какому элементу будут применяться эти шаблоны (например, / значит, что шаблон применится к корневому элементу). По мере необходимости, применяя шаблон, можем указать, что к какому-то определенному элементу нужно применить другой template с помощью элемента apply-template select. Далее ниже по коду, еще лежат шаблоны.

    Недостатки xsl:

    • Если посмотреть исходный код страницы, там только xml, а стилей нет. Сложно отлаживать код.
    • Вся трансформация происходит в браузере (так же, как и в случае с применением css-стилей к xml-документу).

    Глава 2

    Создание и применение таблиц стилей

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

    Глава открывается систематическим рассмотрением таблиц стилей, и, несомненно, начинать следует с представления документа XML с точки зрения таблицы стилей.

    Деревья и узлы

    При работе с XSLT следует перестать мыслить в терминах документов и начать — в терминах деревьев. Дерево представляет данные в документе в виде множества узлов — элементы, атрибуты, комментарии и т.д. трактуются как узлы — в иерархии, и в XSLT структура дерева соответствует рекомендации XPath W3C (www.w3.org/TR/xpath). В данной главе мы рассмотрим деревья и узлы концептуально, а в главах 3 и 4 я дам формальное введение в XPath и его связь с XSLT. Выражения XPath, записываемые в терминах деревьев и узлов, используются для поиска данных в XML-документах.

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

    Таким образом, с точки зрения XSLT документы представляют собой образованные из узлов деревья; XSLT распознает семь типов узлов:

    Корневой узел. Это самое начало документа. Этот узел представляет для процессора XSLT весь документ. Важно: не путайте корневой узел с корневым элементом, который также называется элементом документа (подробнее об этом мы поговорим позже в этой главе);

    Узел атрибута. Содержит значение атрибута после того, как были раскрыты ссылки на сущности и отброшены окружающие символы-разделители;

    Узел комментария. Содержит текст комментария, не содержащий символов

    Узел элемента. Состоит из части документа, заключенной в открывающий и соответствующий ему завершающий теги, или единственный пустой элемент-тег, например

    Узел пространства имен. Представляет объявление пространства имен. Обратите внимание: этот узел добавляется к каждому элементу, к которому применяется это пространство имен;

    Узел инструкции обработки. Содержит текст инструкции обработки, не содержащий символов

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

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

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

    Термин корневой элемент (root element) пришёл из рекомендации XML, и, поскольку его легко спутать с корневым узлом (root node) XSLT, пришедшим из рекомендации XPath, некоторые авторы, пишущие на тему XSLT, называют корневой элемент элементом документа. Очень жаль, что существует такое перекрытие терминов.

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

    В XSLT узлы могут иметь имена — так же, как дочерние узлы (child node) и родительские узлы (parent node). Иными словами, узлы элементов, атрибутов, пространств имен и инструкций обработки могут иметь имена; каждый узел элемента и корневой узел могут иметь дочерние узлы; и все узлы, за исключением корневого, имеют родителей.

    Например, вот как выглядит рассмотренный нами ранее XML-документ в процессоре XSLT в виде дерева, состоящего из узлов:

    text: «Earthquakes for Lunch» text: «Volcanoes for Dinner»

    Как видим, корневой узел расположен на самом верху дерева, за которым следует узел корневого элемента, ему соответствует элемент

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

    ФРАГМЕНТЫ РЕЗУЛЬТИРУЮЩЕГО ДЕРЕВА

    Помимо работы с фрагментами входного дерева, процессоры могут включать в вывод специальный тип данных, в XSLT 1.0 называемый фрагментом результирующего дерева (result tree fragment). Этот тип данных, однако, не был включен в рабочий проект XSLT 1.1 (см. главу 7), поэтому он, скорее всего, не будет входить в состав XSLT 2.0.

    В действительности, рассмотренная только что диаграмма дерева не дает полной картины того, как она выглядит с точки зрения процессора XSLT. Я исключил один тип узлов, который вызывает большую путаницу при изучении XSLT — текстовые узлы, содержащие только символ-разделитель (whitespace). Теперь самое время заняться ими.

    Символ-разделитель

    Пример XML-документа, с которым мы до сих пор работали, выровнен так, чтобы показать иерархическую структуру его элементов:

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

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

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

    text: whitespace element: text: whitespace

    text: whitespace element: text: whitespace element: text: whitespace

    text: «Earthquakes for Lunch» text: «Volcanoes for Dinner»

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

    Следует отметить еще один момент: сами атрибуты трактуются как узлы. Хотя узлы-атрибуты не считаются дочерними узлами тех элементов, в которых они появляются, элемент считается их родительским узлом. (В этом отличие данной модели от модели XML DOM, в которой атрибуты не являются детьми и не имеют родителей.) Если я добавлю атрибут в такой элемент:

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

    text: whitespace element: text: whitespace

    text: whitespace element: text: whitespace element: text: whitespace

    text: Volcanoes for Dinner attribute: pub_date=»2001″

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

    • Строка-значение. Текст узла;

    Базовый URI. Базовый URI узла (XML-вариант URL);

    Дети. Список дочерних узлов; ноль, если детей нет;

    Родитель. Узел-родитель данного узла;

    Имеет атрибут. Определяет атрибуты узла элемента, если таковые имеются;

    Имеет пространство имен. Определяет узлы пространства имен узла-элемента.

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

    Модель информационного множества против модели дерева XSLT

    Разборщики XML передают только определенную информацию: как задается основной спецификацией информационного множества (Information Set) XML — которую можно найти по адресу www.w3.org/TR/xml-infoset, в то время как процессоры XSLT придерживаются модели дерева XSLT. Эти модели, а также элементы, считающиеся в них важными, различны, что может привести к проблемам.

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

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

    Кроме того, информация об объявлениях DTD не передается от разборщика XML в процессор XSLT (возможно, потому, что W3C планирует более широко использовать схемы XML в XSLT 2.0, хотя пока еще нет официального механизма связывания схем XML с документами XML). Как правило, это не образует проблемы, поскольку проверка документа XML входит в задачи разборщика XML, за исключением одного случая: когда атрибут объявлен с типом ID. В XML с типом ID можно объявить атрибут с любым именем, поэтому процессор XSLT не знает, какие атрибуты принадлежат к этому типу, если только у процессора нет доступа к DTD. Это важно при использовании таблиц стилей, встроенных в документы XML, поскольку в этом случае процессор XSLT должен быть способен распознать, в каком элементе документа содержится таблица стилей, нужная для преобразования документа. В этом случае некоторые процессоры XSLT, например, Saxon, идут дальше рекомендации XSLT и проверяют DTD, если они есть, чтобы узнать, какие атрибуты принадлежат к типу ID.

    Еще несколько моментов могут представлять для вас интерес. Например, модель обработки XSLT открывает доступ к префиксам пространств имен во входном дереве, но предоставляет очень небольшие возможности управления ими в выходном дереве, где они обрабатываются автоматически. К тому же, в модели обработки XSLT для каждого узла в дереве определяется базовый URI, представляющий собой URI внешней сущности, от которой был произведен узел. (В рабочем проекте XSLT 1.1 эти возможности были расширены для поддержки спецификации XML Base, как вы увидите ближе к концу этой главы.) Однако в информационном множестве XML базовые URI считаются второстепенными, а это означает, что разборщик XML может не передать эту информацию в процессор XSL.

    В общем, вам следует знать, что процессоры XSLT читают документы XML при помощи разборщиков XML, и что совместная работа этих программных единиц не бесшовна. Если вы обнаружите, что некоторая необходимая информация при преобразовании XSLT пропала, следует вспомнить этот момент. Фактически различие между информационным множеством XML и моделью дерева XSLT — это одна из проблем, которую призван исправить XSLT 2.0. Помимо прочего, в XSLT 2.0 должно быть проще восстанавливать ID и ключевую информацию из исходного документа, а также восстанавливать информацию из объявления XML исходного документа — например, версию XML и кодировку.

    Работа с элементами XSLT

    Для того чтобы создавать таблицы стилей XSLT, вы должны хорошо знать элементы XSLT, такие как

    Язык xml стилевые таблицы xsl

    В предыдущем разделе для вывода элементов XML- документа на экран броузера мы применяли Java Script-сценарии Однако, как уже отмечалось, для этих целей предпочтительней использование специально предназначенного для этого средства — стилевых таблиц XSL(Extensible Stylesheet Language).

    Стилевыми таблицами (стилевыми листами) принято называть специальные инструкции, управляющие процессом отображения элемента в окне программы-клиента(например, в окне броузера). Предложенные в качестве рекомендация W3C, каскадные стилевые таблицы(CSS- Cascading Style Sheets) уже больше года используются Web- разработчиками для оформления Web- страниц.

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

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

    Некоторые его отличия от CSS:
    Во-первых, стилевые таблицы XSL позволяют определять оформление элемента в зависимости от его месторасположения внутри документа, т.е. к двум элементам с одинаковым названием могут применяться различные правила форматирования.
    Во-вторых, языком, лежащем в основе XSL, является XML, а это означает, что XSL более гибок, универсален и у разработчиков появляется возможность использования средства для контроля за корректностью составления таких стилевых списков(используя DTD или схемы данных)
    В-третьих, таблицы XSL не являются каскадными, подобно CSS, т.к. чрезвычайно сложно обеспечить «каскадируемость» стилевых описаний, или, другими словами, возможность объединения отдельных элементов форматирования путем вложенных описаний стиля, в ситуации, когда структура выходного документа заранее неизвестна и он создается в процессе самого разбора. Однако в XSL существует возможность задавать правила для стилей, при помощи которых можно изменять свойства стилевого оформления, что позволяет использовать довольно сложные приемы форматирования.

    Рассмотрим основные структурные элементы XSL, используемые, в частности, в конверторе msxsl, для создания оформления XML-документов.

    Правила XSL

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

    Элементы XML, к которым будет применяться форматирование, обозначаются в XSL дескриптором ;. Для указания элемента с конкретным названием (название элемента определяется тэгами, его обозначающими), т.е. определения класса элемента, можно использовать атрибут type=» «

    Вот пример простейшего XSL-документа, определяющего форматирование для фрагмента rose :

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

    Инструкция указывает на то, что данное правило определяет элемент. Параметром type=»flower» задается название XML-элемента, для которого будет использоваться это правило. Программа-конвертор будет использовать HTML-тэги, помещенные внутри блока для форматирования XML-элемента, которому «предназначался» текущий блок. В том случае, если для какого-то элемента XML шаблон не определяется, в выходной документ будут добавлены тэги форматирования по умолчанию (например,

    Процесс разбора XSL-правил является рекурсивным, т.е. если у элемента есть дочерние элементы, то программа будет искать определения этих элементов, расположенных «глубже» в дереве документа. Указанием на то, что необходимо повторить процесс разбора XML документа, теперь уже для дочерних элементов, является инструкция . Дойдя до нее, анализатор выберет из иерархического дерева XML- элементов нужную ветвь и найдет в XSL-шаблонах правила, определяющие форматирование этих нижележащих элементов. В том случае, если вместо мы укажем инструкцию ;, программа закончит движение по данной ветви и возвратится назад, в родительское правило. При этом текущее правило никакой информации в выходном HTML-документе изменять не будет, т.к. в данном случае означает, что содержимое элемента отсутствует.

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

    Корневое правило

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

    Отношения между элементами

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

    Приоритеты правил

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

    В общем случае приоритет правил определяется следующим образом (в порядке убывания приоритета):

    • правила, помеченные специальным тэгом
    • правила с наибольшим значением атрибута id, если он определен
    • правила с наибольшим значением атрибута class, если он определен
    • правила, имеющие наибольшую вложенность, определяемую тэгом
    • правила, использующие атрибут type совместно с
    • правила, в которых отсутствует атрибут type в или
    • правила с более высоким приоритетом, задаваемым атрибутом priority тэга
    • правила с наибольшим значением квалификаторов ,

    Применительно к и в правилах также могут использоваться специальные элементы ;, при помощи которых можно уточнять характеристики обрабатываемых элементов, задавая различные инструкции форматирования для одинаковых элементов с различными атрибутами. Указываемые в параметры name и value определяют атрибут XML, который должен иметь текущий обрабатываемый элемент. Например, в следующем фрагменте все элементы с атрибутом free_lance =»true» будут выделены в выходном HTML- документе серым цветом

    Фильтрация элементов

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

    Элемент сам по себе не определяет шаблон форматирования, он лишь управляет работой анализатора, обозначая, подобно , «нижележащие» элементы. В приведенном примере элемент должен быть расположен внутри элемента

    Для того, чтобы в шаблоне выделить не только собственные дочерние элементы, но и дочерние элементы потомков, т.е. использовать несколько уровней вложенности, необходимо задать параметр from = «descendants». Если параметр имеет значение «children», что указывает на то, что выбор должен производится из списка собственных дочерних элементов, то атрибут from может опускаться, т.к. «children» является значением по умолчанию.

    Определение функций и глобальных переменных

    Аналогично тэгу в HTML, элемент содержит функции и определения глобальных переменных. Обычно в XSL-документе определяется один элемент , расположенный в самом начале.

    Если применить эти правила к такому фрагменту XML- документу:

    , то на выходе HTML -документ будет содержать следующие элементы:

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

    Использование Java Script для HTML

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

    Встроенные функции XSL

    В завершении приведем список внутренних функций, которые можно использовать в JavaScript –сценариях, предназначенных для анализатора msxsl:

    Язык xml стилевые таблицы xsl

    В предыдущем разделе для вывода элементов XML- документа на экран броузера мы применяли Java Script-сценарии Однако, как уже отмечалось, для этих целей предпочтительней использование специально предназначенного для этого средства — стилевых таблиц XSL( Extensible Stylesheet Language ).

    Стилевыми таблицами (стилевыми листами) принято называть специальные инструкции, управляющие процессом отображения элемента в окне программы-клиента(например, в окне броузера). Предложенные в качестве рекомендация W3C, каскадные стилевые таблицы( CSS- Cascading Style Sheets ) уже больше года используются Web- разработчиками для оформления Web- страниц. Поддержка CSS наиболее известными на сегодняшний день броузерами Netscape Navigator(начиная с версии 4.0) и Microsoft Explorer(начиная с версии 3.0), позволила использовать стилевые таблицы для решения самого широкого спектра задач — от оформления домашней странички до создания крупного корпоративного Web-узла. Слово каскадные в определении CSS означает возможность объединения отдельных элементов форматирования путем вложенных описаний стиля. Например, атрибуты текста, заданные в тэге , будут распространяться на вложенные тэги до тех пор, пока в них не встретятся стилевые описания, отменяющие или дополняющие текущие параметры. Таким образом, использование таблиц CSS в HTML было весьма эффективно — отпадала необходимость явного задания тэгов форматирования для каждого из элементов документа.

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

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

    Некоторые его отличия от CSS:
    Во-первых, стилевые таблицы XSL позволяют определять оформление элемента в зависимости от его месторасположения внутри документа, т.е. к двум элементам с одинаковым названием могут применяться различные правила форматирования.
    Во-вторых, языком, лежащем в основе XSL, является XML, а это означает, что XSL более гибок, универсален и у разработчиков появляется возможность использования средства для контроля за корректностью составления таких стилевых списков(используя DTD или схемы данных)
    В-третьих, таблицы XSL не являются каскадными, подобно CSS, т.к. чрезвычайно сложно обеспечить «каскадируемость» стилевых описаний, или, другими словами, возможность объединения отдельных элементов форматирования путем вложенных описаний стиля, в ситуации, когда структура выходного документа заранее неизвестна и он создается в процессе самого разбора. Однако в XSL существует возможность задавать правила для стилей, при помощи которых можно изменять свойства стилевого оформления, что позволяет использовать довольно сложные приемы форматирования

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

    В этом разделе мы рассмотрим упрощенную объектную модель XSL— документа, используемую в текущей версии XSL-конвертора Microsoft msxsl, и поэтому информацию, изложенную далее, нельзя считать описанием стандарта языка.

    Все примеры, приводимые далее, могут быть проверены при помощи XSL— конвертора, свободно доступного на странице Microsoft [ www.microsoft.com/xml/xsl/ ]

    С чего начать

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

    Принцип обработки XML— документов стилевыми таблицами

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

    Структура XSL- таблиц

    Рассмотрим основные структурные элементы XSL, используемые, в частности, в конверторе msxsl, для создания оформления XML-документов.

    Правила XSL

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

    Элементы XML, к которым будет применяться форматирование, обозначаются в XSL дескриптором ;. Для указания элемента с конкретным названием (название элемента определяется тэгами, его обозначающими), т.е. определения класса элемента, можно использовать атрибут type=» «

    Вот пример простейшего XSL-документа, определяющего форматирование для фрагмента flower>rose :

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

    Инструкция указывает на то, что данное правило определяет элемент. Параметром type=»flower» задается название XML-элемента, для которого будет использоваться это правило. Программа-конвертор будет использовать HTML-тэги, помещенные внутри блока для форматирования XML-элемента, которому «предназначался» текущий блок. В том случае, если для какого-то элемента XML шаблон не определяется, в выходной документ будут добавлены тэги форматирования по умолчанию (например,

    Процесс разбора XSL-правил является рекурсивным, т.е. если у элемента есть дочерние элементы, то программа будет искать определения этих элементов, расположенных «глубже» в дереве документа. Указанием на то, что необходимо повторить процесс разбора XML документа, теперь уже для дочерних элементов, является инструкция . Дойдя до нее, анализатор выберет из иерархического дерева XML— элементов нужную ветвь и найдет в XSL-шаблонах правила, определяющие форматирование этих нижележащих элементов. В том случае, если вместо мы укажем инструкцию ;, программа закончит движение по данной ветви и возвратится назад, в родительское правило. При этом текущее правило никакой информации в выходном HTML-документе изменять не будет, т.к. в данном случае означает, что содержимое элемента отсутствует.

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

    Ниже приведен пример более сложного XSL— описания, некоторые фрагменты которого будут пояснены позже.

    Методическое пособие по курсу «Язык разметки xml»

    Название Методическое пособие по курсу «Язык разметки xml»
    страница 3/4
    Дата публикации 13.04.2013
    Размер 0.67 Mb.
    Тип Методическое пособие

    uchebilka.ru > Информатика > Методическое пособие

    Стилевые таблицы XSL, Переменные и параметры

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

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

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

    • Переменная — это объект определенного типа, с которым связанно имя

    По этому имени мы можем обращаться к объекту, использовать его значение и т.д. Иными словами, в XSLT под переменной понимается не более чем ассоциация между значением и именем, и если мы скажем, что переменная x имеет значение 5, это будет означать, что имя «x» связанно с объектом численного типа, значение которого равно 5.

    Теперь, когда с понятием переменной в XSLT кое-что прояснилось, отметим следующий факт: переменнве в XSLT не могут быть измененны! Разработчикам, которые до сих пор не имели опыта логического программирования и использовали в своей пректике традиционные языки программирования, будет нелегко с этим смириться. То, что переменные не могут быть измененны, дискредитирует само название — переменные, ибо они уже более похожи на константы.

    В XSLT объявление переменной есть создание ассоциации между объектом и именем.
    ^

    Элемент xsl:variable

    Элемент xsl:variable в XSLT используется для связи имени переменной, указанного атрибутом name со значением. Значение переменной может быть полученно вычислением выражения, заднного необязательным атрибутом select или выполнением шаблона в содержимом элемента. Использовать объявленную таким образом переменную можно, указывая перед именем символ $:

    Переменные XSLT могут быть глобальными и локальными. Если элемент xsl:variable является элементом верхнего уровня, то переменная будет глобальной; если элемент xsl:variable объявлен внутри шаблонного правила — локальной.

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

    Локальную переменную можно использовать только после объявления и только в том же родительском элементе, которому принадлежит объявляющий элемент xsl:variable. Если существует одноименная глобальная переменноя, то локальная переменная в своей области видимости перекрывает ее. Имена локальных переменных могут совпадать, если их области видимости не пересекаются.
    ^

    Использование переменных

    Как правило, первой реакцией на известие о том, что переменные в XSLT нельзя изменять является реплика: «Да зачем они вообще тогда нужны?». Претензия со стороны процедурного программирования вполне серьезнаа и обоснованна — изменяемые переменные являютсся неотъемлимой частью сложных многошаговых вычислений. Тем не менее, переменные, даже в таком виде, в каком они присутсвуют в XSLT, являются очень важным и полезным элементом языка. Ниже перечислены наиболее типичные случаи использования переменных:

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

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

    Попробуем разобраться на примерах.

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

    Гораздо удобнее и экономней с точки зрения вычислительных ресурсов объявить переменную вида

    и использовать ее в преобразовании как $links. Например:

    . количество ссылок в документе:

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

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

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

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

    если условие1 то

    присвоить переменной1 значение1

    присвоить переменной1 значение2

    В традиционном языке программирования с изменяемыми переменными (например C++ или Javascript) это выглядело бы так:

    или в чуть более широком варианте:

    if (условие1) переменная1=значение1

    Однако если в XSLT написать что нибудь подобное

    то требуемого результата все равно не достигли бы по той причине, что переменная будет иметь в этом случае локальную область видимости, ограниченную элементом xsl:when или xsl:otherwise и их дочерними элементами. Правильный шаблон для решения этой задачи выглядит следующим образом:

    Илон Маск рекомендует:  Свойства шрифта в CSS
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL