Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
xsl.doc
Скачиваний:
93
Добавлен:
09.05.2015
Размер:
3.45 Mб
Скачать

Сортировка

В этой лекции вы уже познакомились с двумя элементами, которые вы можете использовать для обработки повторяющихся элементов: for-each иapply-templates. Вы можете использовать атрибут order-by для этих элементов, чтобы управлять порядком, в котором браузер обрабатывает элементы, тем самым осуществляя сортировку данных XML.

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

Например, атрибут order-by, установленный для следующего элемента for-each, предписывает браузеру сортировать элементы BOOK по фамилиям авторов в порядке возрастания, а также осуществлять сортировку для одинаковых фамилий по именам, также по возрастанию:

<xsl:for-each select="INVENTORY/BOOK"

order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME">

В другом примере следующая установка order-by осуществляет сортировку элементов BOOK по названиям книг по убыванию:

<xsl:apply-templates select="INVENTORY/BOOK" order-by="-TITLE">

Оператор пути, который вы присваиваете атрибуту order-by, действует относительно образца, назначенного атрибуту select. Так, в данном примере установка order-by="-TITLE" указывает на элемент TITLE внутри элемента BOOK, вложенного в элемент INVENTORY.

Доступ к атрибутам xml

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

Например, фильтр в следующем начальном теге выделяет все элементы BOOK с атрибутом InStock, имеющем значение "yes". Другими словами, он выбирает только книги, которые имеются в наличии:

<xsl:for-each select="INVENTORY/BOOK[@InStock='yes']">

Вы можете использовать XSL-элемент value-of для извлечения значений атрибута точно так же, как вы это делаете для извлечения текстового содержимого элемента. Например, следующий элемент value-of получает значение атрибута Born, принадлежащего элементу AUTHOR:

<xsl:value-of select="AUTHOR/@Born"/>

Таблица стилей, представленная в Листинге 10.8, демонстрирует технику доступа к атрибутам, принадлежащим элементам в XML-документе. Эта таблица стилей связана с XML-документом из Листинга 10.9 и отображает все имеющиеся в наличии книги из каталога.

<?xml version="1.0"?>

<!-- File name: XslDemo06.xsl -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">

<H2>Books In Stock</H2>

<TABLE BORDER="1" CELLPADDING="5">

<THEAD>

<TH>Title</TH>

<TH>Author</TH>

<TH>Binding Type</TH>

<TH>Number of Pages</TH>

<TH>Price</TH>

</THEAD>

<xsl:for-each select="INVENTORY/BOOK[@InStock='yes']">

<TR ALIGN="CENTER">

<TD>

<xsl:value-of select="TITLE"/>

</TD>

<TD>

<xsl:value-of select="AUTHOR"/> <BR/>

(born <xsl:value-of select="AUTHOR/@Born"/>)

</TD>

<TD>

<xsl:value-of select="BINDING"/>

</TD>

<TD>

<xsl:value-of select="PAGES"/>

</TD>

<TD>

<xsl:value-of select="PRICE"/>

</TD>

</TR>

</xsl:for-each>

</TABLE>

</xsl:template>

</xsl:stylesheet>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]