Почему при использовании скриптов, приведенных в курсе Основы XML лекция Лекция 8: Отображение XML-документов с использованием связывания данных не происходит связывания XLM документа с HTML? Отображаются пустые поля. Браузер IE11 |
Отображение 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 использует элемент 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.)