Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_XML.doc
Скачиваний:
16
Добавлен:
03.05.2019
Размер:
3.94 Mб
Скачать

Лабораторная работа №13

  1. Создайте первую XSL-таблицу стилей с использованием XSL-элемента “for-each” для отображения XML-документа из лабораторной работы №1.

  2. Вставьте в данный XML-документ инструкцию по обработке, использующую указанную XSL-таблицу стилей.

  3. Сохраните оба файла в папке под своей фамилией.

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

  5. Вставьте в данный XML-документ инструкцию по обработке, использующую указанную XSL-таблицу стилей.

  6. Сохраните оба файла в папке под своей фамилией.

  7. Откройте поочерёдно оба XML-документа для просмотра в браузере Internet Explorer.

  8. При появлении сообщений об ошибках, постарайтесь их найти и устранить.

  9. Сдайте работы преподавателю.

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

Значение, которое присваивается атрибутам match или select, представляет собой образец, соответствующий одному или нескольким элементам в XML-документе. (Атрибут match используется для элемента template, а атрибут select - для элементов value-of, for-each и apply-templates.) Образцы, с которыми имели дело до сих пор, содержали только оператор пути, который задавал имя элемента и, возможно, одного или нескольких вложенных элементов. Можно ограничить количество элементов, отвечающих шаблону, введя фильтр - выражение, заключенное в квадратные скобки ([]) и следующее непосредственно за оператором пути. Например, образец, присвоенный следующему атрибуту match, указывает, что соответствующий элемент должен носить имя BOOK и, кроме того (это определяется фильтром), должен иметь дочерний элемент BINDING, который содержит текст “Мягкая обложка”:

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

match="ITEM[CD]"

Следующий образец отвечает любому элементу SHIRT, имеющему дочерний элемент COLOR, содержащий текст “красный”:

match="SHIRT[COLOR='красный']"

А следующий образец, наоборот, отвечает любому элементу SHIRT, имеющему дочерний элемент COLOR, который не содержит текст “красный”:

select="SHIRT[COLOR='красный']"

Если элемент имеет более одного дочернего элемента с именем, указанным в условии фильтрации, оператор сравнения применяется только к первому дочернему элементу. Например, если элемент SHIRT имеет два дочерних элемента COLOR, образец "SHIRT[COLOR='красный']" будет отвечать элементу, только если первый элемент COLOR содержит слово “красный”.

Итак, элементы 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.

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

<?xml version="1.0"?>

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">

<H2>Описание книги</H2>

<xsl:for-each select="INVENTORY/BOOK[BINDING='Мягкая обложка']" order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME">

<SPAN STYLE="font-style:italic">Автор: </SPAN>

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

<SPAN STYLE="font-style:italic">Заголовок: </SPAN>

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

<SPAN STYLE="font-style:italic">Цена: </SPAN>

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

<SPAN STYLE="font-style:italic">Тип обложки: </SPAN>

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

<SPAN STYLE="font-style:italic">Количество страниц: </SPAN>

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

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Листинг 1.40

<?xml version="1.0"?>

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">

<H2>Описание книги</H2>

<xsl:applay-templates select="INVENTORY/BOOK" order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME"/></xsl:template>

<xsl:template match="BOOK[BINDING='Мягкая обложка']">

<SPAN STYLE="font-style:italic">Автор: </SPAN>

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

<SPAN STYLE="font-style:italic">Заголовок: </SPAN>

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

<SPAN STYLE="font-style:italic">Цена: </SPAN>

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

<SPAN STYLE="font-style:italic">Тип обложки: </SPAN>

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

<SPAN STYLE="font-style:italic">Количество страниц: </SPAN>

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

</xsl:template>

</xsl:stylesheet>

Листинг 1.41

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

[BINDING='Мягкая обложка']

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

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

На рисунке 60 показано как выглядит выводимая информация, которая является одинаковой для обеих таблиц стилей.

Рисунок 60. Отображение содержимого всех элементов “BOOK”

Таблица стилей из Листинга 1.40 использует элемент 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>

Таблица стилей из Листинга 1.41 использует для отображения множества элементов BOOK элемент apply-templates вместе с отдельными шаблонами, отвечающими элементам «BOOK». В этой таблице стилей фильтр добавлен к шаблону, соответствующему элементам BOOK:

<xsl:template match="BOOK[BINDING='Мягкая обложка']">

Добавление фильтра к элементу apply-templates будет иметь тот же эффект. Атрибут order-by может быть добавлен к элементу apply-templates следующим образом:

<xsl:apply-templates setect="INVENTORY/BOOK" order-by="+AUTHOR/LASTNAME; +AUTHOR/FIRSTNAME"/>

Атрибут order-by следует добавить к элементу apply-templates, поскольку элемент template не распознает этот атрибут. (Можно использовать атрибут order-by только для элемента, который указывает браузеру осуществить просмотр среди множества элементов - а именно, for-each и apply -templates.)