Автор: Александр Календарев, 19 марта 2005
Ближе к практике. Сортировка.
Одна из часто применяемых практических задач – это вывод отсортированной таблицы, причем критерий сортировки определен данными, т.е. при разработке шаблона мы заранее знаем только перечень критериев, по которым будет производиться сортировка. Для примера возьмем прайс-лист, который можно отсортировать по:
* цене
* наименованию товара
* наименованию группы товаров
Если в шаблоне не запланировано вывода нескольких таблиц, то имя критерия сортировки можно содержать в корневом элементе. В случае, если таблиц несколько, то имя критерия сортировки, можно хранить в атрибуте корневого элемента фрагмента данных таблицы. Лично я использую для этого корневой элемент. Допустим, имеется следующая структура данных:
Значение атрибута sort корневого элемента root определяет, какой тип сортировки использовать. В данном примере используется сортировка по категориям товаров (type).
Шаблон, обрабатывающий тег <table> и [строящий] таблицу, будет выглядеть следующим образом:
<xsl:template match="/">
<html>
<body>
<xsl:apply-templates select="root/table" />
</body>
</html>
</xsl:template >
<xsl:template match="table">
<xsl:variable name="sort" select="//root/@sort"/>
<table>
<xsl:for-each select="item">
<xsl:sort select="@name[$sort=′name′]"/>
<xsl:sort select="@price[$sort=′price′]"/>
<xsl:sort select="@type[$sort=′type′]"/>
<tr>
<td><xsl:value-of select="@name"/></td>
<td><xsl:value-of select="@type"/></td>
<td><xsl:value-of select="@price"/></td>
</tr>
</xsl:for-each >
</table>
</xsl:template >
|
Для реализации данного шаблона использован XSLT-элемент <xsl:variable>, который определяет XSLT переменную $sort. Данная переменная содержит значение атрибута sort корневого элемента root.
Для определения критерия сортировки использовались предикаты выборки. При вычислении предиката его результат приводится к булевому типу. Синтаксически предикат заключен в квадратные скобки, т.е. конструкция типа <xsl:sort select="@type[$sort=′type′]"/> показывает, что сортировка будет осуществляться для всех узлов по ключу, соответствующему атрибуту @type, при условии, что значение переменной $sort будет равно стоковому выражению [type]. Соответственно, по каждому критерию, по которому будет осуществлена сортировка, необходима своя команда <xsl:sort>.
Заключение
Конечно, количество всяких методов и приемов при разработке XSLT шаблонов множество и [нельзя объять необъятное]. В настоящее время даже появились разные стили написания шаблонов. Я попытался охватить лишь первые этапы [Путешествия в страну Шаблонизации].
В данной статье были отражены в основном главные проблемы, с которыми сталкиваются юные XSLT-шаблонизаторы. Планируется продолжение.
Уже после написания данной статьи автор узнал о существовании инструментария XSLT-разработчика, включающее средства XSLT-отладки. Это такие программные продукты, как: xselerate, Stylus Studio, Altova XML StyleVision. Данные программные продукты являются платными.
Автор будет благодарен за любую критику данного материала, а также будет рад услышать ваши пожелания и узнать, с какими же вы сталкивались трудностями при разработке XSLT–шаблонов. Все замечания будут учтены при подготовке следующей статьи из цикла: [Шаблонизация на XSLT].