Основы XML

       

Пример таблицы стилей, осуществляющей фильтрацию и сортировку


В этом разделе приведено два примера XSL-таблиц стилей, представленных в Листингах 10.6 и 10.7. Каждый из них осуществляет фильтрацию и сортировку элементов BOOK, подлежащих отображению.

<?xml version="1.0"?>

<!-- Имя файл: XslDemo04.xsl -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <H2>Book Inventory</H2> <xsl:for-each select="INVENTORY/BOOK[BINDING='trade paperback']" order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME"> <SPAN STYLE="font-style:italic">Author: </SPAN> <xsl:value-of select="AUTHOR"/><BR /> <SPAN STYLE="font-style:italic">Title: </SPAN> <xsl:value-of select="TITLE"/><BR /> <SPAN STYLE="font-style:italic">Binding type: </SPAN> <xsl:value-of select="BINDING"/><BR /> <SPAN STYLE="font-style:italic">Number of pages: </SPAN> <xsl:value-of select="PAGES"/><BR /> <SPAN STYLE="font-style:italic">Price: </SPAN> <xsl:value-of select="PRICE"/><P /> </xsl:for-each> </xsl:template> </xsl:stylesheet>

Листинг 10.6. Xsldemo04.xsl (html, txt)

<?xml version="1.0"?>

<!-- Имя файл: XslDemo05.xsl -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <H2>Book Inventory</H2> <xsl:apply-templates select="INVENTORY/BOOK" order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME"/> </xsl:template>

<xsl:template match="BOOK[BINDING='trade paperback']"> <SPAN STYLE="font-style:italic">Author: </SPAN> <xsl:value-of select="AUTHOR"/><BR /> <SPAN STYLE="font-style:italic">Title: </SPAN> <xsl:value-of select="TITLE"/><BR /> <SPAN STYLE="font-style:italic">Binding type: </SPAN> <xsl:value-of select="BINDING"/><BR /> <SPAN STYLE="font-style:italic">Number of pages: </SPAN> <xsl:value-of select="PAGES"/><BR /> <SPAN STYLE="font-style:italic">Price: </SPAN> <xsl:value-of select="PRICE"/><P /> </xsl:template> </xsl:stylesheet>


Листинг 10.7. Xsldemo05.xsl (html, txt)
Обе таблицы стилей разработаны для связывания с XML-документом из Листинга 10.4 (XslDemo.xml). В них использован следующий фильтр, предписывающий браузеру отображать только книги, имеющие прошитый бумажный переплет (trade paperback):
[BINDING='trade paperback']
В обоих примерах используется следующая установка order-by, задающая сортировку элементов BOOK по возрастанию по фамилиям авторов, а затем по именам авторов:
order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME"
На рисунке 10.6 показано как выглядит первая часть выводимой информации, которая является одинаковой для обеих таблиц стилей.

Рис. 10.6. 
Таблица стилей из Листинга 10.6 использует элемент for-each для отображения множества элементов BOOK. В приведенной ниже таблице стилей для элемента for-each установлены и фильтр, и атрибут order-by:
<xsl:for-each select="INVENTORY/BOOK[BINDING='trade paperback']" order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME"> <!-- отображение текущего элемента BOOK --> </xsl:for-each>
Таблица стилей из Листинга 10.7 использует для отображения множества элементов BOOK элемент apply-templates вместе с отдельными шаблонами, отвечающими элементам "BOOK". В этой таблице стилей фильтр добавлен к шаблону, соответствующему элементам BOOK:
<xsl:template match="BOOK[BINDING='trade paperback']">
Добавление фильтра к элементу apply-templates будет иметь тот же эффект.
Атрибут order-by может быть добавлен к элементу apply-templates следующим образом:
<xsl:apply-templates select="INVENTORY/BOOK" order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME"/>
Атрибут order-by следует добавить к элементу apply-templates, поскольку элемент template не распознает этот атрибут. (Вы можете использовать атрибут order-by только для элемента, который указывает браузеру осуществить просмотр среди множества элементов – а именно, for-each и apply-templates.)
Содержание раздела