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

8.6. Доступ к атрибутам 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