Опубликован: 24.01.2007 | Уровень: для всех | Доступ: платный
Лекция 10:

Отображение XML-документов с использованием XSL-таблиц стилей

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

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

<?xml version="1.0" encoding="windows-1251"?>

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
   <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
<?xml version="1.0" encoding="windows-1251"?>

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
   <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

Обе таблицы стилей разработаны для связывания с 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.)

Максим Попов
Максим Попов

Почему при использовании скриптов, приведенных в курсе Основы XML

лекция Лекция 8: 

Отображение XML-документов с использованием связывания данных

не происходит связывания XLM документа с HTML?

Отображаются пустые поля. Браузер IE11

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Наталья Алмаева
Наталья Алмаева
Россия
Светлана Казьмина
Светлана Казьмина
Россия, Волгодонск