Главная Обратная связь

Дисциплины:

Архитектура (936)
Биология (6393)
География (744)
История (25)
Компьютеры (1497)
Кулинария (2184)
Культура (3938)
Литература (5778)
Математика (5918)
Медицина (9278)
Механика (2776)
Образование (13883)
Политика (26404)
Правоведение (321)
Психология (56518)
Религия (1833)
Социология (23400)
Спорт (2350)
Строительство (17942)
Технология (5741)
Транспорт (14634)
Физика (1043)
Философия (440)
Финансы (17336)
Химия (4931)
Экология (6055)
Экономика (9200)
Электроника (7621)






Фильтрация и сортировка данных 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.)

 

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

 

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

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

 

<xsl:for-each select="INVENTORY/BOOK[@lnStock='да']">

 

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

 

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

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

 

<?xml version="1.0"?>

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

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

<xsl:template match="/">

<H2>Наличие книг</H2>

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

<THEAD>

<TH>Заголовок</TH>

<ТН>Автор</TH>

<TH>Тип обложки</TH>

<TH>Количество страниц</TH>

<ТН>Цена</TH>

</THEAD>

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

<TR ALIGN="CENTER">

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

<TD><xsl:value-of select="AUTHOR"/><BR/>(Страна автора <xsl:value-of selecl="AUTHOR/@Country"/>)</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>

Листинг 1.42

 

<?xml version="1.0"?>

<!-- Имя файла: Inventory09.xml -->

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

<INVENTORY>

<BOOK InStock="да">

<TITLE>Война и мир</TITLE>

<AUTHOR Country="Россия">Лев Толстой</AUTHOR>

<BINDING>Жёсткая обложка</BINDING>

<PAGES>510</PAGES>

<PRICE>12 000 рублей</PRICE>

</BOOK>

<BOOK InStock="нет">

<TITLE>Преступление и наказание</TITLE>

<AUTHOR Country="Россия">Фёдор Достоевский</AUTHOR>

<BINDING>Мягкая обложка</BINDING>

<PAGES>590</PAGES>

<PRICE>14 000 рублей</PRICE>

</BOOK>

<BOOK InStock="да">

<TITLE>Королева Марго</TITLE>

<AUTHOR Country="Франция">Александр Дюма</AUTHOR>

<BINDING>Мягкая обложка</BINDING>

<PAGES>410</PAGES>

<PRICE>10 000 рублей</PRICE>

</BOOK>

<BOOK InStock="нет">

<TITLE>Затерянный мир</TITLE>

<AUTHOR Country="Англия">Артур Конан Дойль</AUTHOR>

<BINDING>Жёсткая обложка</BINDING>

<PAGES>350</PAGES>

<PRICE>9 000 рублей</PRICE>

</BOOK>

</INVENTORY>

Листинг 1.43

 

Каждый элемент BOOK в XML-документе содержит атрибут InStock, имеющий значение “нет” или “нет”, указывающий наличие или отсутствие книги в хранилище. Каждый элемент AUTHOR имеет атрибут Country, содержащий год рождения автора.

Вместо отображения значения атрибута InStock таблица стилей использует атрибут в условии фильтрации с целью избежать отображения элементов BOOK для книг, которых нет в наличии:

 

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

<!-- отображение каждого элемента BOOK -->

</xsl:for-each>

 

Таблица стилей отображает каждый элемент BOOK в виде HTML-таблицы, а не через список элементов SPAN, как в предыдущих примерах. Она отображает значение атрибута Country после значения элемента AUTHOR, используя XSL-элемент value-of. Следующие элементы создают ячейку таблицы для отображения этих значений:

 

<TD>

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

(Страна автора: <xsl:value-of select="AUTHOR/@Country"/>)

</TD>

На следующем рисунке показано, как Internet Explorer отображает документ.

Рисунок 61. Отображение XML-документа из листинга 1.43 при помощи таблицы стилей из листинга 1.42

 

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

 

1. Создайте XSL-таблицу стилей, при помощи которой осуществляется фильтрация и сортировка данных в XML-документе из лабораторной работы №5.

2. В данной XSL-таблице стилей нужно предусмотреть возможность доступа и отображения атрибутов из вышеуказанного XML-документа.

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

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

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

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

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

 


Эта страница нарушает авторские права

allrefrs.ru - 2018 год. Все права принадлежат их авторам!