Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

XSL-таблицы стилей: отображение XML-документа

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

XSL-таблица стилей (eXtensible Stylesheet Language - расширяемый язык таблиц стилей) связывается с XML-документом и сообщает браузеру, как отображать данные XML. XSL позволяет открывать XML-документ непосредственно в браузере без посредничества HTML-страницы. XSL позволяет осуществлять отбор и сортировку данных XML при их отображении, предоставляет доступ ко всем компонентам XML (элементам, атрибутам, комментариям и инструкциям по обработке), даёт возможность включать в таблицу стилей сценарии.

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

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

    <?xml-stylesheet type="text/xsl" href=xslFileURL?>

Здесь "xslFileURL" - URL файла XSL-таблицы стилей. Если вы используете полный (не относительный) URL, таблица стилей должна размещаться в том же домене, что и сам XML-документ. Инструкция по обработке xml-stylesheet добавляется в пролог XML-документа вслед за объявлением XML.

Если вы связываете с XML-документом более одной XSL-таблицы стилей, браузер использует первую таблицу и игнорирует все остальные. Если вы связываете с XML-документом одновременно CSS-таблицу и XSL-таблицу стилей, браузер использует только XSL-таблицу стилей.

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

res://msxml3.dll/defaultss.xsl

Вы можете просмотреть эту таблицу, введя указанный URL в адресную строку Internet Explorer.

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
    <!-- один или несколько элементов шаблонов... -->
</xsl:stylesheet>


Элемент xsl:stylesheet служит не только хранилищем всех других элементов, но также идентифицирует документ как XSL-таблицу стилей. Все XSL-элементы принадлежат пространству имён xsl - т.е. имя каждого элемента предваряется префиксом xsl. Это пространство имён определено в начальном тэге элемента xsl:stylesheet.

Шаблоны имеют следующую форму:

<xsl:template match="/">
    <!-- дочерние элементы... -->
</xsl:template>


Браузер использует каждый шаблон для отображения определённой ветви элементов в иерархии XML-документа. Атрибут match шаблона указывает на определённую ветвь и аналогичен селектору в правиле CSS. Значение атрибута match называется образцом (pattern). Образец в приведённом выше примере ("/") представляет "элемент", для которого является дочерним корневой элемент XML-документа (т.е. представляет "сам" XML-документ). Этот шаблон будет таким образом служить для отображения всего XML-документа. Каждая XSL-таблица стилей должна содержать один и только один шаблон с образцом "/". Вы также можете включить один или несколько дополнительных шаблонов для отображения определённых подчинённых ветвей XML-документа.

Шаблон может содержать два вида XML-элементов:

XSL-элемент value-of добавляет текстовое содержимое определённого XML-элемента и всех его дочерних элементов в выходной модуль HTML. Вы указываете определённый XML-элемент заданием образца, который присваиваете атрибуту select элемента value-of. XML-элемент в образце задаётся с помощью оператора пути (в примере - "PRODUCT/TITLE"). Оператор пути аналогичен неполному пути к файлу, задающему местонахождение файла относительно текущей рабочей папки. Текущим элементом ("текущей папкой") является значение атрибута match самого шаблона. Если вы опустите атрибут select для XSL-элемента value-of, будет использоваться этот текущий элемент.

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

Вам не нужно включать в XSL-шаблон HTML-элементы "HTML" и "BODY", поскольку они будут сформированы автоматически.

Чтобы отобразить все отвечающие образцу XML-элементы, а не только первый из них, следует использовать XSL-элемент for-each, например:

<xsl:template match="/">
    <H2>Заголовок</H2>
    <xsl:for-each select="PRODUCTS/PRODUCT">
        <SPAN>Наименование:</SPAN>
        <xsl:value-of select="TITLE" />

        <!-- другие элементы шаблона... -->

    </xsl:for-each>
</xsl:template>


Атрибут select элемента for-each задаёт текущий элемент, поэтому внутри элемента for-each все образцы (пути к элементам в атрибутах select) задаются уже относительно этого текущего элемента.

Другой способ отображения всех отвечающих образцу XML-элементов, а не только первого из них, состоит в использовании XSL-элемента apply-templates:

<xsl:template match="/">
    <H2>Заголовок</H2>
    <xsl:apply-templates select="PRODUCTS/PRODUCT" />
</xsl:template>

<xsl:template match="PRODUCT">
        <SPAN>Наименование:</SPAN>
        <xsl:value-of select="TITLE" /> <BR />

        <!-- другие элементы шаблона... -->

</xsl:template>

В приведённом выше примере XSL-элемент apply-templates сообщает браузеру, что для каждого элемента PRODUCT внутри корневого элемента PRODUCTS он должен обрабатывать шаблон, для атрибута match которого установлено значение "PRODUCT".

Если вы не укажете атрибут select для элемента apply-templates, браузер будет обрабатывать соответствующий шаблон (если таковой имеется) для каждого дочернего элемента текущего элемента.

XSL трактует любой атрибут, принадлежащий любому элементу в XML-документе, как дочерний элемент. Однако, когда вы ссылаетесь на атрибуты, вы должны предварять имя атрибута символом @. Например, вот так может выглядеть ссылка на атрибут import элемента PRODUCT:

<xsl:value-of select="PRODUCT/@import" />

Пример отображения XML-документа

Попробуем отобразить с помощью XSL-таблицы стилей следующий XML-документ, представляющий из себя некий абстрактный упрощённый каталог товаров:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href=Sample.xsl?>
<!DOCTYPE PRODUCTS
     [
     <!ELEMENT PRODUCTS (PRODUCT)*>
     <!ELEMENT PRODUCT (TITLE, SORT+)>
     <!ELEMENT TITLE (#PCDATA)>
     <!ELEMENT COLOR (#PCDATA)>
     <!ELEMENT PRICE (#PCDATA)>
     <!ELEMENT SORT (COLOR, PRICE)>
     <!ATTLIST PRODUCT import (yes | no) "no">
     ]
>
<PRODUCTS>
    <PRODUCT import="yes">
        <TITLE> Product #1 </TITLE>
        <SORT>
            <COLOR> red </COLOR>
            <PRICE> $10.00 </PRICE>
        </SORT>
        <SORT>
            <COLOR> blue </COLOR>
            <PRICE> $11.00 </PRICE>
        </SORT>
        <SORT>
            <COLOR> gray </COLOR>
            <PRICE> $16.00 </PRICE>
        </SORT>
    </PRODUCT>
    <PRODUCT>
        <TITLE> Product #2 </TITLE>
        <SORT>
            <COLOR> red </COLOR>
            <PRICE> $20.00 </PRICE>
        </SORT>
        <SORT>
            <COLOR> green </COLOR>
            <PRICE> $22.00 </PRICE>
        </SORT>
    </PRODUCT>
    <PRODUCT import="yes">
        <TITLE> Product #3 </TITLE>
        <SORT>
            <COLOR> red </COLOR>
            <PRICE> $30.00 </PRICE>
        </SORT>
        <SORT>
            <COLOR> blue </COLOR>
            <PRICE> $33.00 </PRICE>
        </SORT>
    </PRODUCT>
    <PRODUCT>
        <TITLE> Product #4 </TITLE>
        <SORT>
            <COLOR> red </COLOR>
            <PRICE> $40.00 </PRICE>
        </SORT>
        <SORT>
            <COLOR> blue </COLOR>
            <PRICE> $44.00 </PRICE>
        </SORT>
    </PRODUCT>
    <PRODUCT>
        <TITLE> Product #5 </TITLE>
        <SORT>
            <COLOR> red </COLOR>
            <PRICE> $50.00 </PRICE>
        </SORT>
        <SORT>
            <COLOR> gray </COLOR>
            <PRICE> $55.00 </PRICE>
        </SORT>
    </PRODUCT>
</PRODUCTS>

XSL-таблица стилей (файл Sample.xsl) для отображения приведённого выше XML-документа может выглядеть следующим образом:

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
	<H1>Каталог товаров</H1>
	<xsl:apply-templates select="PRODUCTS/PRODUCT" />
</xsl:template>
<xsl:template match="PRODUCT">
	<SPAN style="font-style:italic">Наименование:</SPAN>
	<xsl:value-of select="TITLE" /> <BR />
	<SPAN style="font-style:italic">Импортный:</SPAN>
	<xsl:value-of select="@import" /> <BR />
	<TABLE border="1" width="100%" cellspacing="0">
	<xsl:apply-templates select="SORT" />
	</TABLE>
	<BR />
</xsl:template>
<xsl:template match="SORT">
	<TR>
	<TD><xsl:value-of select="COLOR" /></TD>
	<TD><xsl:value-of select="PRICE" /></TD>
	</TR>
</xsl:template>
</xsl:stylesheet>

Фильтрация и сортировка данных

Вы можете ограничить количество элементов, отвечающих шаблону, введя фильтр - выражение, заключённое в квадратные скобки и следующее непосредственно за оператором пути. Например, следующий образец указывает, что обрабатывать надо только те элементы PRODUCT, у которых есть сорт серого цвета (элемент SORT имеет дочерний элемент COLOR, который содержит текст "gray"):

<xsl:apply-templates select="PRODUCTS/PRODUCT[SORT/COLOR='gray']" />

Следующий образец указывает, что обрабатывать надо только импортные товары (т.е. только те элементы PRODUCT, у которых атрибут import равен "yes":

<xsl:apply-templates select="PRODUCTS/PRODUCT[@import='yes']" />

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

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

<xsl:apply-templates select="PRODUCTS/PRODUCT" order-by="+@import; -TITLE" />

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.