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

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

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

<INVENTORY>

<BOOK>

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

<AUTHOR>

<FIRSTNAME>Лев</FIRSTNAME>

<LASTNAME>Толстой</LASTNAME>

</AUTHOR>

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

<PAGES>510</PAGES>

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

</BOOK>

<BOOK>

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

<AUTHOR>

<FIRSTNAME>Фёдор</FIRSTNAME>

<LASTNAME>Достоевский</LASTNAME>

</AUTHOR>

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

<PAGES>590</PAGES>

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

</BOOK>

</INVENTORY>

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

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

<xsl:template match="/">

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

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

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

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

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

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

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

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

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

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

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

</xsl:template>

</xsl:stylesheet>

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

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

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

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

<?xml version="1.0"?>

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

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

<xsl:template match="/">

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

<xsl:for-each select="INVENTORY/BOOK">

<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"/>

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Листинг 1.37

<?xml version="1.0"?>

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

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

<INVENTORY>

<BOOK>

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

<AUTHOR>

<FIRSTNAME>Лев</FIRSTNAME>

<LASTNAME>Толстой</LASTNAME>

</AUTHOR>

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

<PAGES>510</PAGES>

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

</BOOK>

<BOOK>

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

<AUTHOR>

<FIRSTNAME>Фёдор</FIRSTNAME>

<LASTNAME>Достоевский</LASTNAME>

</AUTHOR>

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

<PAGES>590</PAGES>

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

</BOOK>

<BOOK>

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

<AUTHOR>

<FIRSTNAME>Александр</FIRSTNAME>

<LASTNAME>Дюма</LASTNAME>

</AUTHOR>

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

<PAGES>410</PAGES>

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

</BOOK>

<BOOK>

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

<AUTHOR>

<FIRSTNAME>Артур</FIRSTNAME>

<LASTNAME>Конан Дойль</LASTNAME>

</AUTHOR>

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

<PAGES>350</PAGES>

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

</BOOK>

</INVENTORY>

Листинг 1.38

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

<xsl:for-each select="INVENTORY/BOOK">

<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"/>

</xsl:for-each>

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

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

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

<хsl:stylesheet xmlns:xsl=http://WWW.W3.org/TR/WD-xsl>

<xsl:template match="/">

<!-- Здесь текущим является корневой "элемент" документа, "/". ->

<xsl:for-each select="INVENTORY/BOOK">

<!-- Здесь текущим является элемент/INVENTORY/BOOK. -->

</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

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

<xsl:value-of setect="TITLE"/>

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

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