На рисунке 10.7 показано как Internet Explorer 5 отображает документ.



http://www.intuit.ru/department/internet/xml/10/10_07.gif

Смотрите также:
Xsl-таблица стилей более мощный и гибкий инструмент для отображения xml-документов, чем css-таблица
315.33kb.
1 стр.
Реферат " Поддержка xml. Краткий обзор Oracle xdk"
99.83kb.
1 стр.
Приемы работы с css (справочник)
157.56kb.
1 стр.
2. Решение задачи в Excel (таблица с цифрами и таблица с формулами)
180.7kb.
1 стр.
Работа с редактором Web-страниц ms front Page
38.65kb.
1 стр.
Конспект урока по предмету трудовое обучение в 5 классе По теме: «Кубанский картофель качественный продукт питания»
43.81kb.
1 стр.
Цветок и его строение
97.61kb.
1 стр.
Урок 1: Что такое css? Немного о том, почему появился css и почему лучше использовать css поверх html для дизайна страниц
604.93kb.
1 стр.
Инструкция №8-05/11 по применению средства инсектоакарицидного «медилис-супер»
509.85kb.
3 стр.
Презентация фирмы (6 слайдов). Все слайды имеют чисто рекламный характер. На первом размещёна фотография
108.73kb.
1 стр.
Какой должна быть детская музыка?
26.43kb.
1 стр.
Механизированный аварийно-спасательный инструмент
122.89kb.
1 стр.
Главная
страница 1
В этой лекции вы познакомитесь с последним из рассматриваемых в этом курсе методов отображения XML-документов в браузере Microsoft Internet Explorer 5 – расширяемым языком таблиц стилей XSL (Extensible Stylesheet Language). Подобно таблице каскадных стилей (CSS), рассмотренной в лекции 7, XSL-таблица стилей связывается с XML-документом и сообщает браузеру, как отображать данные XML. Это позволяет вам открывать XML-документ непосредственно в браузере без посредничества HTML-страницы.

XSL-таблица стилей – более мощный и гибкий инструмент для отображения XML-документов, чем CSS-таблица. Используя XSL-таблицы стилей, вы можете не только задать формат для каждого элемента XML, как при CSS-таблицы, но и обеспечить средства контроля над выводимыми данными. XSL позволяет выбрать те данные XML, которые вы хотите отобразить, представить эти данные в любом порядке, свободно модифицировать или добавлять информацию. XSL предоставляет вам доступ ко всем компонентам XML (элементам, атрибутам, комментарии и инструкции по обработке). Эта таблица позволяет вам легко сортировать и фильтровать данные XML, дает возможность включать в таблицу стиля сценарии и предоставляет набор полезных методов, которые вы можете использовать при обработке информации.

Базовая форма XSL-таблицы стилей, описываемая в этой лекции, избирательно преобразует XML-документ в HTML-страницу, воспринимаемую и отображаемую затем браузером. Получая доступ к богатому арсеналу HTML, вы к методам преобразования XSL добавляете новые возможности по форматированию и обработке данных.

Однако XSL-таблицы являются более сложными для понимания, чем CSS-таблицы. Работа с ними требует знания языка HTML. Кроме того, это новая технология, поэтому имеет меньшую степень поддержки – меньшую степень унификации среди современных браузеров.



Ссылка. Эта лекция знакомит с основами XSL. Вы можете узнать больше об этой мощной, развивающейся технологии XML, обратившись к официальным спецификациям XSL, которые можно найти на Web-страницах, предоставленных консорциумом World Wide Web Consortium (W3C): "Extensible Stylesheet Language (XSL) Version 1.0" по адресу http://www.w3.org/TR/WD-xsl и "XSL Transformations (XSLT) Version 1.0"по адресуhttp://www.w3.org/TR/WD-xslt. Чтобы подробнее узнать о поддержке XSL в Internet Explorer 5, обратитесь к следующим Web-страницам, предоставленным Microsoft Developer Network (MSDN): "XSL Developer's Guide" по адресу http://msdn.microsoft.com/xml/xslguide/default.asp и "XSL Reference" по адресу http://msdn.microsoft.com/xml/reference/xsl/start.asp.

Основы использования XSL-таблиц стилей

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


  1. Создание файла XSL-таблицы стилей. XSL является приложением XML, т. е. XSL-таблица представляет собой корректно сформированный XML-документ, который отвечает правилам XSL. Подобно любому XML-документу, XSL-таблица стилей содержит простой текст, и вы можете создать ее с помощью вашего любимого текстового редактора. В последующих разделах рассказывается, как создавать различные типы XSL-таблиц стилей.

  2. Связывание XSL-таблицы стилей с XML-документом. Вы можете связать XSL-таблицу стилей с XML-документом, включив в документ инструкцию по обработке xml-stylesheet, которая имеет следующую обобщенную форму записи:

Здесь XSLFilePath представляет собой заключенный в кавычки URL, указывающий местонахождение файла таблицы стилей. Вы можете использовать полный URL, например:



href="http:/www.my_domain.com/Inventory.xsl"?>

Чаще используют неполный URL, который задает местонахождение относительно месторасположения XML-документа, содержащего инструкцию по обработке xml-stylesheet, например:

(Относительный URL встречается чаще, поскольку вы обычно храните файл таблицы стилей в той же папке, где хранится XML-документ, либо в одной из вложенных в нее папок.)



Подсказка. Хотя вы и можете связать XSL-таблицу стилей с использованием полного URL, таблица стилей при этом должна размещаться на том же домене, что и XML-документ, с которым вы ее связываете. Например, если домен http://mspress.microsoft.com/ содержит XML-документ, то и XSL-таблица стилей должна размещаться на том же домене.

Обычно инструкция по обработке xml-stylesheet добавляется в пролог XML-документа вслед за объявлением XML, как вы увидите в примере XML-документа, рассматриваемого в следующем разделе (см. Листинг 10.2). Более подробная информация об инструкциях по обработке и описании мест в документе, куда они могут быть корректно помещены, содержится в разделе "Использование инструкций по обработке" в лекции 4.

Если вы связали XSL-таблицу стилей с XML-документом, вы можете открыть этот документ непосредственно в Internet Explorer 5, и браузер отобразит XML-документ с использованием инструкций по преобразованию, содержащихся в таблице стилей. В отличие от таблиц каскадных стилей, если вы связываете с XML-документом более одной XSL-таблицы стилей, браузер использует первую таблицу и игнорирует все остальные. Если вы свяжете с XML-документом и CSS-таблицу и XSL-таблицу стилей, браузер использует только XSL-таблицу стилей.

Примечание. Если вы не связали XML-документ ни с CSS-таблицей, ни с XSL-таблицей стилей, Internet Explorer 5 отобразит документ с помощью встроенной XSL-таблицы, которая используется по умолчанию. Эта таблица стилей отображает исходный XML-текст в виде дерева с возможностью свертывания/развертывания уровней (см. раздел "Отобразите XML-документ без таблицы стиля" в лекции 2).

Использование одного шаблона XSL


В отличие от CSS, содержащей правила, XSL-таблица стилей включает один или несколько шаблонов, каждый из которых содержит информацию для отображения в определенной ветви элементов в XML-документе. В этом разделе вы узнаете, как создать простую XSL-таблицу стилей, которая включает только один шаблон. Этот шаблон содержит информацию для отображения всего документа.

В Листинге 10.1 представлен первый пример XSL-таблицы стилей. Эта таблица стилей связана с XML-документом, представленным в Листинге 10.2.







Book Description



Author:




Title:




Price:




Binding type:




Number of pages:







Листинг 10.1. XslDemo01.xsl (html, txt)






Moby-Dick



Herman

Melville



hardcover

724


$9.95




Листинг 10.2. XslDemo01.xml (html, txt)

На рисунке 10.1 показано как Internet Explorer 5 отображает XML-документ в соответствии с инструкциями из таблицы стилей.

http://www.intuit.ru/department/internet/xml/10/10_01.gif


Рис. 10.1. 

Каждая XSL-таблица стилей должна иметь элемент Документ, представленный ниже. (Напомним, что элемент Документ, известный как корневой элемент, является XML-элементом верхнего уровня, который содержит все остальные элементы.)





Элемент Документ xsl:stylesheet служит не только хранилищем других элементов, но также идентифицирует документ как XSL-таблицу стилей. Этот элемент является одним из XSL-элементов специального назначения, используемых в таблице стилей. Все XSL-элементы принадлежат пространству имен xsl – т. е. вы предваряете имя каждого XSL-элемента префиксом xsl:, обозначающим пространство имен. Вы определяете это пространство имен в начальном теге элемента xsl:stylesheet, например, следующим образом:

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

Это определение позволяет вам использовать пространство имен внутри элементов таблицы стилей. (Относительно пространства имен в XML см. раздел "Вставка HTML-элементов в XML-документы и использование пространства имен" в лекции 7.)

Элемент Документ xsl:stylesheet XSL-таблицы стилей должен содержать один или несколько шаблонов элементов, которые для краткости будем называть шаблонами. Элемент Документ из Листинга 10.1 содержит только один шаблон, который имеет следующую форму:



Браузер использует шаблон для отображения определенной ветви элементов в иерархии XML-документа, с которым вы связываете таблицу стилей. Атрибут match шаблона указывает на определенную ветвь. (Атрибут match аналогичен селектору в правиле CSS). Значение атрибута match носит название образца (pattern). Образец в данном примере ("/") представляет корневой элемент всего XML-документа. Этот шаблон, таким образом, содержит инструкции для отображения всего XML-документа.

Каждая XSL-таблица стилей должна содержать один и только один шаблон с атрибутом match, который имеет значение "/". Вы также можете включить один или несколько дополнительных шаблонов с инструкциями для отображения определенных подчиненных ветвей в структуре XML-документа; каждая из них должна иметь образец, отвечающий определенной ветви.

Корневой образец ("/") не представляет элемент Документ (или корневой элемент) XML-документа. Он представляет весь документ, для которого элемент Документ является дочерним. (Т. е. он аналогичен корневому узлу Document в объектной модели документа DOM, рассмотренной в лекции 9.)


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


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







Book Inventory



select="INVENTORY/BOOK[BINDING='trade paperback']"

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

Author:




Title:




Binding type:




Number of pages:




Price:










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







Book Inventory



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






Author:




Title:




Binding type:




Number of pages:




Price:








Листинг 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 показано как выглядит первая часть выводимой информации, которая является одинаковой для обеих таблиц стилей.

http://www.intuit.ru/department/internet/xml/10/10_06.gif


Рис. 10.6. 

Таблица стилей из Листинга 10.6 использует элемент for-each для отображения множества элементов BOOK. В приведенной ниже таблице стилей для элемента for-each установлены и фильтр, и атрибут order-by:



select="INVENTORY/BOOK[BINDING='trade paperback']"

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

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



Добавление фильтра к элементу apply-templates будет иметь тот же эффект.

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

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

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

Вот полное описание шаблона из рассматриваемой таблицы стилей:





Book Description



Author:




Title:




Price:




Binding type:




Number of pages:



Шаблон содержит два вида XML-элементов.



  • XML-элементы, представляющие HTML-разметку. Примерами подобного вида XML-элемента из рассматриваемой таблицы стилей являются:

Book Description

который отображает заголовок второго уровня,



Author:

который отображает блок текста, набранного курсивом (Author:), и


который создает пустую строку.

Все эти XML-элементы являются корректно сформированными и представляют стандартные HTML-элементы. Браузер просто копирует каждый HTML-элемент непосредственно на выход HTML, который воспринимает и отображает их.



Подсказка. Каждый из элементов, представляющих HTML-разметку, должен быть корректно сформированным XML-элементом, а также стандартным HTML-элементом. (Не забывайте, что XSL-таблица стилей является XML-документом.) Следовательно, вы не можете использовать HTML-конструкции, которые не являются корректно сформированным XML, такие, как элементы, состоящие только из начального тега. Например, чтобы задать элемент перевода строки в HTML, вы не можете просто ввести 
, как вы это делаете для HTML-страницы. Вместо этого вы должны использовать корректно сформированный тег пустого XML-элемента, 
.

  • XSL-элементы. Примерами XSL-элементов из рассматриваемой таблицы стилей являются элементы xsl:value-of, например:

Браузер отличает XSL-элемент от элемента, представляющего HTML, поскольку первый имеет в качестве префикса описание пространства именxsl:. XSL-элементы в шаблоне не копируются на выход HTML. Они лишь содержат инструкции по выбору и модификации данных XML, либо используются для выполнения других задач.

XSL-элемент value-of добавляет текстовое содержимое определенного XML-элемента – а также любых его дочерних элементов, которые он имеет – в выходной модуль HTML, который воспринимается и отображается браузером. Вы указываете определенный XML-элемент заданием образца, который присваиваете атрибуту select XSL-элемента value-of. В рассмотренном выше примере элемента value-of атрибуту select присвоен образец "BOOK/AUTHOR", что приводит к выводу текстового содержимого элемента AUTHOR XML-документа. Текстовое содержимое элемента AUTHORсостоит из символьных данных, принадлежащих двум его дочерним элементам, FIRSTNAME и LASTNAME.

Обратите внимание, что XML-элемент в образце задается с помощью оператора пути (в данном случае BOOK/AUTHOR ), который определяет местонахождение элемента в иерархии XML-документа. (Оператор пути аналогичен пути к файлу, который операционная система использует для указания местонахождения файла или папки.)

Главный момент, на который здесь следует обратить внимание, состоит в том, что оператор пути в значении атрибута select относится к текущему элементу. Каждый контекст внутри XSL-таблицы стилей относится к текущему элементу. Поскольку рассматриваемый пример шаблона относится к корневому элементу всего документа (посредством установки атрибута match="/" ), текущим "элементом" для данного шаблона является корневой элемент документа. (В данном случае текущий элемент не обладает соответствующим литералом, а является родителем элемента Документ.) Таким образом, внутри этого шаблона оператор пути BOOK/AUTHOR указывает на элемент AUTHOR, вложенный в элемент BOOK, вложенный в корневой элемент документа. (Оператор пути в значении атрибута select аналогичен неполному пути к файлу, задающему местонахождение файла относительно текущей рабочей папки.)

Если вы опустите атрибут select для XSL-элемента value-of, элемент будет осуществлять вывод текстового содержимого плюс текстовое содержимое всех дочерних элементов текущего элемента. (В нашем примере, поскольку текущим является корневой элемент, пропуск атрибутаselect приведёт к выводу всех символьных данных XML-документа.)

Целью представленного в рассматриваемом примере шаблона элементов является отображение текста названия для каждого из дочерних XML-элементов в документе ( AUTHOR, TITLE, PRICE, BINDING и PAGES ) плюс текстового содержимого каждого элемента. Обратите внимание, что порядок элементов value-of в шаблоне определяет порядок, в котором браузер отображает эти элементы. Таким образом, даже из этой простой таблицы стилей вы можете понять, что XSL-таблица стилей является гораздо более гибкой, чем CSS, которая всегда отображает элементы в том порядке, в котором они следуют в документе.

Итак, как вы могли заметить, XSL-таблица стилей сообщает браузеру, как отобразить XML-документ путем избирательного преобразования XML-элементов в блок HTML-разметки, который воспринимается и отображается браузером аналогично разметке, содержащейся на HTML-странице. Заметим, однако, что вам не нужно включать в XSL-шаблон элементы, представляющие элементы HTML или BODY, которые являются стандартными составными частями HTML-страницы, поскольку браузер сам эффективно их формирует.

На рисунке 10.2 показано как браузер генерирует первую часть блока HTML-разметки для документа и таблицы стилей из Листингов 10.1 и 10.2.

http://www.intuit.ru/department/internet/xml/10/10_02.gif




Рис. 10.2. 

XML-документ





Herman
Melville

XSL-таблица стилей



Book Description



Author:


Отображаемый HTML



Book Description



Author:

Hermann Melville



Ссылка. Для получения более подробной информации о работе с HTML и динамическим HTML (DHTML) в Internet Explorer 5, обратитесь к следующему Web-сайту, предоставленному MSDN: http://msdn.microsoft.com/workshop/author/default.asp. Если вы хотите познакомиться с официальной спецификацией HTML, обратитесь к следующему Web-сайту, предоставленномуW3C: http://www.w3.org/TR/REC-html40/.

Отображение переменного числа элементов

В примере, рассмотренном в предыдущем разделе (см. Листинг 10.2), XML-документ содержал только один элемент BOOK. В случае, если документ содержит несколько элементов BOOK, методика, с которой вы познакомились в предыдущем разделе, способна отобразить только один из элементов. Возьмем, для примера, XML-документ, содержащий следующий элемент Документ:







The Adventures of Huckleberry Finn



Mark

Twain



mass market paperback

298


$5.49






The Adventures of Tom Sawyer



Mark

Twain



mass market paperback

205


$4.75






The Ambassadors



Henry

James



mass market paperback

305


$5.95




Предположим, что таблица стилей, используемая для отображения этого документа, содержит следующий шаблон:







Book Description



Author:




Title:




Price:




Binding type:




Number of pages:





Этот шаблон использует методику, описанную в предыдущем разделе. Обратите внимание, что образец присваиваемых каждому атрибуту selectначинается с указания элемента Документ, в данном случае INVENTORY (например, "INVENTORY/BOOK/AUTHOR" ).

Каждый образец, однако, соответствует трем различным элементам. Например, "INVENTORY/BOOK/AUTHOR" соответствует элементу AUTHOR для всех трех элементов BOOK. В подобной ситуации браузер использует только первый из соответствующих элементов. Таким образом, таблица стилей отобразит содержимое только первого элемента BOOK, как показано на рисунке 10.3.

http://www.intuit.ru/department/internet/xml/10/10_03.gif




Рис. 10.3. 

Чтобы отобразить все отвечающие образцу элементы, следует использовать XSL-элемент for-each, который вызывает повторный вывод для каждого из содержащихся в XML-файле элементов. XSL-таблица стилей, представленная в Листинге 10.3, демонстрирует данную методику. Эта таблица стилей связана с XML-документом, содержащимся в Листинге 10.4.







Book Inventory





Title:




Author:




Binding type:




Number of pages:




Price:










Листинг 10.3. XslDemo02.xsl (htmltxt)








The Adventures of Huckleberry Finn



Mark

Twain



mass market paperback

298


$5.49






The Adventures of Tom Sawyer



Mark

Twain



mass market paperback

205


$4.75






The Ambassadors



Henry

James



mass market paperback

305


$5.95






The Awakening



Kate

Chopin



mass market paperback

195


$4.95






Billy Budd



Herman

Melville



mass market paperback

195


$4.49






A Connecticut Yankee in King Arthur's Court



Mark

Twain



mass market paperback

385


$5.49






Joan of Arc



Mark

Twain



trade paperback

465


$6.95






Leaves of Grass



Walt

Whitman



hardcover

462


$7.75






The Legend of Sleepy Hollow



Washington

Irving



mass market paperback

98

$2.95








The Marble Faun



Nathaniel

Hawthorne



trade paperback

473


$10.95






Moby-Dick



Herman

Melville



hardcover

724


$9.95






Passing



Nella

Larsen



trade paperback

165


$5.95






The Portrait of a Lady



Henry

James



mass market paperback

256


$4.95






Roughing It



Mark

Twain



mass market paperback

324


$5.25






The Scarlet Letter



Nathaniel

Hawthorne



trade paperback

253


$4.25






The Turn of the Screw



Henry

James



trade paperback

384


$3.35






Листинг 10.4. XslDemo.xml (htmltxt)

Шаблон в таблице стилей из Листинга 10.3 содержит следующий элемент for-each:





Title:




Author:




Binding type:




Number of pages:




Price:




Элемент for-each выполняет две основные задачи:



  • осуществляет вывод блока элементов, содержащихся внутри элемента for-each, повторяя его для каждого XML-элемента в документе, отвечающего образцу, присвоенному атрибуту select элемента for-each. В данном примере цикл выполняется по одному разу для каждого элемента BOOK, найденного в элементе Документ с именем INVENTORY. Образец, присваиваемый атрибуту select элемента for-each, работает точно так же, как образец, присваиваемый атрибуту select элемента value-of ;

  • внутри элемента for-each задает текущий элемент, устанавливаемый атрибутом select элемента for-each ( /INVENTORY/BOOK в нашем примере указывает на элемент BOOK внутри элемента INVENTORY, входящего в корневой элемент документа) следующим образом:







  • документа, "/". -->









Аналогично, внутри элемента for-each каждый дочерний элемент может быть выбран путем задания образца, содержащего только имя элемента, например:



В результате выводятся данные из всех элементов BOOK, найденных в документе, независимо от того, сколько этих элементов содержит документ. На рисунке 10.4 показано как выглядит результат в Internet Explorer 5. (В окне отображены только первые три элемента BOOK ; чтобы отобразить остальные, необходимо осуществить прокрутку вниз.)

:

http://www.intuit.ru/department/internet/xml/10/10_04.gif




Рис. 10.4. 

Использование нескольких шаблонов

Другой способ отображения повторяющихся XML-элементов состоит в создании отдельного шаблона для каждого элемента с последующим вызовом этого шаблона с использованием XSL-элемента apply-templates. Пример использования подобной методики приведен в XSL-таблице стилей, представленной в Листинге 10.5.









Book Inventory








Title:




Author:




Binding type:




Number of pages:




Price:








Листинг 10.5. XslDemo03.xsl (htmltxt)

Эта таблица стилей предназначена для связывания с XML-документом из Листинга 10.4, XslDemo.xml; установить эту связь вы можете путем модификации инструкции xml-stylesheet в документе следующим образом:

Рассматриваемая в примере таблица стилей содержит два шаблона. Один шаблон содержит инструкции для отображения всего документа (путем установки match="/", указывающей на корневую часть документа). Все XSL-таблицы стилей требуют наличия такого шаблона. Другой шаблон содержит инструкции для отображения элемента BOOK (шаблон с установкой match="BOOK" ). Сначала браузер обрабатывает шаблон, соответствующий корневой части элемента:





Book Inventory





XSL-элемент apply-templates сообщает браузеру, что для каждого элемента BOOK внутри корневого элемента INVENTORY он должен обрабатывать шаблон, отвечающий элементу BOOK – т. е. шаблон, для атрибута match которого установлено значение "BOOK". Таблица стилей включает следующий шаблон, отвечающий элементу BOOK:





Title:




Author:




Binding type:




Number of pages:




Price:




Поскольку этот шаблон отвечает элементу BOOK, элемент BOOK является текущим элементом в контексте шаблона. В связи с этим доступ к дочерним элементам BOOK осуществляется посредством образца, содержащего только имя элемента, как в нашем примере:





Примечание. Если вы не укажете атрибут select для элемента apply-templates, браузер обрабатывает соответствующий шаблон (если он имеется) для каждого дочернего элемента текущего элемента. В рассматриваемом примере элемента apply-templates единственным дочерним элементом для текущего элемента (корневая часть документа) является элемент INVENTORY, который не имеет соответствующего шаблона. Таким образом, если вы опустите атрибут select, никакие данные не будут выведены.

Браузер обрабатывает шаблон BOOK один раз для каждого элемента BOOK, отображая всю информацию о книгах, имеющуюся в документе, как показано на рисунке 10.5.

http://www.intuit.ru/department/internet/xml/10/10_05.gif


Рис. 10.5. 

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

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

Фильтрация

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



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

match="ITEM[CD]"

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

match="SHIRT[COLOR='red']"

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

select="SHIRT[COLOR!='red']"

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

Сортировка

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

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

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

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

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

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



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

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

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

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



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







Books In Stock





































Title Author Binding Type Number of Pages Price







(born )





















Листинг 10.8. XslDemo06.xsl (htmltxt)








The Adventures of Huckleberry Finn

Mark Twain

mass market paperback

298


$5.49






Leaves of Grass

Walt Whitman

hardcover

462


$7.75






The Marble Faun

Nathaniel Hawthorne

trade paperback

473


$10.95






Moby-Dick

Herman Melville

hardcover

724


$9.95






Листинг 10.9. XslDemo06.xml (htmltxt)

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

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



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






(born )