Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы XML-технологий. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
</xsl:for-each> </xsl:template> </xsl:stylesheet>
налогично, внутри элемента
А
.
аждый дочерний элемент
or-each
f
к может быть выбран путем задания образца, содержащего только имя элемента, например:
<xsl:value-of select="title"/><BR />.
результате выводятся данные всех элементов
В
book
найденных
, в документе, независимо от того, сколько этих элементов содержит документ.
4.3.4
ИСПОЛ ЬЗОВАНИ Е НЕС КО ЛЬКИХ Ш АБЛОНОВ
Другой способ отображения повторяющихся
X
ML
-э
лементов
состоит в создании отдельного шаблона для каждого элемента
X
с последующим вызовом этого шаблона с использованием
лемента
э
apply-templates
.
Пример использования подобной методики приведен в
SL
-
X
SL
-
аблице стилей, представленной в файле
т
<
!-- Имя файла: XSL_Catalog03.xsl --> <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/"> <h2>Описание книг</h2> <xsl:apply-templates select="inventory/book" /> </xsl:template>
<xsl:template match="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>
CatalogXSL03.xsl
.
<xsl:value-of select="binding"/><br /> <span style="font-style:italic">Количество страниц: </span> <xsl:value-of select="pages"/><p />
14
1
</xsl:template>
</xsl:stylesheet>
Э
та таблица стилей предназначена для отображения
документа
C
atalogXSL02.xml
CatalogXSL03.xml
т
олько тем, что содержит другую инструкцию
который отличается от
,
XML
окумента
-д
X
ML
-
обработки
<?xml-stylesheet type="text/xsl" href="CatalogXSL03.xsl"?>.
ассматриваемая в примере таблица стилей содержит два
Р
шаблона. Один шаблон содержит инструкции для отображения всего
atch="/"
документа (путем установки часть документа). Все
-та
X
SL
m
указывающей на корневую
,
блицы стилей требуют наличия такого шаблона. Другой шаблон содержит инструкции для отображения элемента
ok
bo
(шаблон с установкой
atch="book"
m
).
Сначала браузер обрабатывает шаблон, соответствующий
корневой части элемента:
<
xsl:template match="/"> <h2>Описание книг</h2> <xsl:apply-templates select="inventory/book" /> </xsl:template>
XSL
элемента
-эл
емент
в
b
ook
тывать шаблон, отвечающий элементу бута
match
к
оторого установлено значение
включает следующий шаблон, отвечающий элементу
<x
sl:template match="book"> <span style="font-style:italic">Автор: </span> <xsl:value-of select="author"/><br /> <!-- Остальные элементы шаблона --> </xsl:template>
П
оскольку этот шаблон отвечает элементу
я
вляется текущим элементом в контексте шаблона. В связи с этим
доступ к дочерним элементам
ply-templates
ap
ообщает браузеру, что для каждого
с
нутри корневого элемента
bo
book
ос
он д
in
ventory
ok
, т. е. ш
"book"
олжен обраба-
аблон, для атрии-
.
Таблица стилей
:
ook
b
book
,
элемент
book
уществляется посредством
образца, содержащего только имя элемента, как в нашем примере:
<xsl:value-of select="title"/>
14
2
lect
римечание. Если вы не укажете атрибут
П
a
te
pply
имеется) для каждого дочернего элемента текущего элемента. В рассматри­ваемом примере элемента apply-templates единственным дочерним элементом для текущего элемента (корневая часть документа) является элемент
nventory
i
mplates
-
,
, браузер обрабатывает соответствующий шаблон (если он
который не имеет соответствующего шаблона. Таким образом, если
se
ля элемента
д
вы опустите атрибут
Б
раузер обрабатывает шаблон
элемента
,
отображая всю информацию о книгах, имеющуюся
b
ook
se
,
никакие данные не будут выведены.
lect
од
bo
ok
ин раз для каждого
в документе. При этом мы получаем то же отображение, что и в предыдущем примере (см. Рис. 4.7).
Ф
4.4
ИЛЬТРАЦИЯ И СОРТИРОВКА ДАННЫХ XML
В последующих двух подразделах вы познакомитесь с основами
X
применения данных
X
ML
SL
аблиц стилей для фильтрации и сортировки
-т
.
После этого вам будут представлены примеры таблиц
стилей, демонстрирующие методики фильтрации и сортировки.
Ф
4.4.1
ИЛ ЬТРАЦИЯ Д АННЫХ
Значение, которое присваивается атрибутам
X
ML
m
atch
или
elect
s
, представляет собой образец, соответствующий одному или несколь­ким элементам в
emplate
элемента и
pply-templates
a
t
,
). Образцы, с которыми вы имели дело до сих пор,
-документе. (Атрибут
ML
X
elect
s
а атрибут
– д
используется для
atch
m
ля элементов
alue-of
v
f
,
or-each
содержали только оператор пути, который задавал имя элемента и, возможно, одного или нескольких вложенных элементов. Вы можете ограничить количество элементов, отвечающих шабло­ну, введя фильтр – выражение, заключенное в квадратные скобки (
[ ]
) и следующее непосредственно за оператором пути. Например, образец, присвоенный следующему атрибуту соответствующий элемент должен носить имя
match
b
ook
определяется фильтром), должен иметь дочерний элемент который содержит текст
<
xsl:template match="book[binding='бумажный переплет']">
"б
умажный переплет"
:
указывает, что
,
и кроме того (это
,
binding
,
14
3
Если в фильтр включено только имя элемента, то соответствую-
щий элемент должен иметь дочерний элемент с указанным именем.
TEM
Например, следующий образец отвечает любому элементу и
меющему дочерний элемент с именем
D
мого элемента
C
:
независимо от содержи-
,
CD
I
,
m
atch="item[CD]"
Следующий образец отвечает любому элементу
имеющему дочерний элемент
atch="shirt[COLOR=`red`]"
m
римечание. Если элемент имеет более одного дочернего элемента
П
с именем, указанным в условии фильтрации, оператор сравнения применя­ется только к первому дочернему элементу. Например, если элемент и
меет два дочерних элемента
чать элементу, только если первый элемент
4.4.2
СО
;
OLOR
C
;
C
OLOR
,
образец
РТ ИРОВКА ДАННЫХ
,
содержащий текст
"s
hirt[ COLOR='red']"
одержит слово
COLOR
с
XML
:
d"
"re
б
удет отве-
"red"
S
HIRT
.
s
hirt
Мы уже познакомились с двумя элементами, которые можно
дл
for-each
я этих
использовать для обработки повторяющихся элементов: и
a
pply-templates
Вы можете использовать атрибут
.
ord
er-by
элементов, чтобы управлять порядком, в котором браузер обрабаты-
,
вает элементы, тем самым осуществляя сортировку данных
or
ы можете назначать атрибуту
В
der-by
один или несколько
X
ML
.
образцов, разделяя их точкой с запятой. Браузер будет сортиро- вать элементы с использованием образцов в том порядке, в котором они перечислены. Для указания направления сортировки (по возрас­танию или по убыванию) следует предварить образец префиксом
+
и
элемента п
о фамилиям авторов в порядке возрастания, а также осуществлять
–
.
ли
Н
апример, атрибут
or-each
f
,
предписывает браузеру сортировать элементы
o
rder-by
, установленный для следующего
ook
b
сортировку для одинаковых фамилий по именам и по возрастанию:
xsl:apply-templates select="inventory/book"
< order-by="+author/lastname; +author/firstname"/>
другом примере следующая установка
В
сортировку элементов
b
ook
п
о названиям книг по убыванию:
.
rder-by
o
существляет
о
14
4
<xsl:apply-templates select="inventory/book" order-by="-title"/>.
s
elect
order-by
.
Так,
itle
t
О
ператор пути, который вы присваиваете атрибуту действует относительно образца, назначенного атрибуту в данном примере установка
bo
ok
нутри элемента
в
SL-
4.4.3
В
X
этом подразделе приведены два примера
Т
,
вложенного в элемент
АБ ЛИЦЫ С ФИ ЛЬТРАЦИ ЕЙ И СОРТ ИРОВКОЙ
rder-by="-title"
o
казывает на элемент
у
i
nventory
.
аблиц стилей.
-т
SL
X
Каждый из них осуществляет фильтрацию и сортировку элементов
подлежащих отображению. Обе таблицы стилей разработаны
,
ook
b
для связывания с
В
них использован фильтр
X
ML
-д
окументом
Ca
talogXSL04.xml
[bi
nding='бумажный переплет']
.
предписы-
, вающий браузеру отображать только книги, имеющие бумажный переплет.
rder-by
В обоих примерах используется следующая установка
адающая сортировку элементов
з
b
ook
п
о возрастанию по фамилиям
o
,
,
авторов, а затем по именам авторов:
order-by="+author/lastname; +author/firstname".
C
Рассмотрим таблицу стилей
<
!-- Файл: CatalogXSL04.xsl -->
<?xml version="1.0"?> <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='бумажный переплет']" 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>
atalogXSL04.xsl
, приведенную ниже.
<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>
14
5
<xsl:value-of select="price"/><P /> </xsl:for-each> </xsl:template>
</xsl:stylesheet>.
Данная таблица стилей использует элемент
ook
b
жения множества элементов элемента
< order-by="+author/lastname; +author/firstname"> <!-- отображение текущего элемента book -->
</xsl:for-each>
Н
f
or-each
xsl:for-each select="inventory/book[binding='бумажный переплет']"
а Рис. 4.8 показано, как выглядит первая часть выводимой
установлены и фильтр, и атрибут
.
.
В этой таблице стилей для
f
or-each
o
для отобра-
rder-by
:
информации, которая является одинаковой для обеих таблиц стилей.
с. 4.8 Отображение общей части выводимой информации
Ри
14
6
Вторая таблица стилей для отображения множества элементов
b
ook
нами, отвечающими элементам
a
pply-templates
ook
b
пользует элемент
ис
добавлен к шаблону, соответствующему элементам
xsl:template match="book[binding='бумажный переплет']">.
<
Д
обавление фильтра к элементу
месте с отдельными шабло-
в
.
В этой таблице стилей фильтр
:
bo
ok
a
pply-templates
б
удет иметь тот же
эффект.
o
Атрибут
с
ледующим образом:
xsl:apply-templates select="inventory/book"
< order-by="+author/lastname; +author/firstname"/>
Атрибут
rder-by
o
rder-by
поскольку элемент использовать атрибут
мож
ет быть добавлен к элементу
следует добавить к элементу
распознает этот атрибут. (Вы можете
o
rder-by
не
только для элемента, который указы-
template
a
pply-templates
a
pply-templates
,
вает браузеру осуществить просмотр среди множества элементов, а именно,
f
or-each
и
a
pply-templates
).
Таблица стилей
<
!-- Листинг: файл CatalogXSL05.xsl -->
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <H2>Описание книг</H2> <xsl:for-each select="inventory/book[binding='твердый']"> <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="binding"/><BR /> <SPAN STYLE="font-style:italic">Количество страниц: </SPAN> <xsl:value-of select="pages"/><BR /> <SPAN STYLE="font-style:italic">Цена: </SPAN>
Ca
talogXSL05.xsl
в
целом приведена ниже.
<xsl:value-of select="price"/><P /> </xsl:for-each> </xsl:template>
14
7
<
/xsl:stylesheet>
4.5
Д
ОСТУП К АТРИБУТАМ XML
трактует атрибут, принадлежащий элементу в
X
SL
-
X
ML
документе, как дочерний элемент. Однако для ссылки на атрибут в образце
XSL
вы должны предварить имя атрибута символом @, что
указывает на то, что имя относится к атрибуту, а не к элементу.
Например, фильтр в следующем начальном теге выделяет все
элементы
b
ook
с
атрибутом
I
nStock
,
имеющем значение
"y
es"
.
Другими
словами, он выбирает только книги, которые имеются в наличии:
<xsl:for-each select="inventory/book[@InStock='yes']">
Вы можете использовать
-элемент
SL
X
va
lue-of
для извлечения значений атрибута точно так же, как вы это делаете для извлечения текстового содержимого элемента. Например, следующий элемент
alue-of
v
п
в элемент
xsl:value-of select="author/@ГодРождения"/>
<
Т
аблица стилей, представленная в файле
олучает значение атрибута
uthor:
a
дРождения
Го
talogXSL06.xsl
Ca
ложенного
, в
,
демон-
стрирует технику доступа к атрибутам, принадлежащим элементам
ML
X
в
окументе.
-д
<
!-- Листинг: файл CatalogXSL06.xsl --> <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <H2>Книги в хранилище</H2> <TABLE BORDER="1" CELLPADDING="5"> <THEAD> <TH>Название</TH> <TH>Автор</TH> <TH>Тип переплета</TH> <TH>Страницы</TH> <TH>Цена</TH> </THEAD>
<xsl:for-each select="inventory/book[@InStock='yes']"> <TR ALIGN="CENTER"> <TD ALIGN="LEFT"><xsl:value-of select="title"/></TD>
14
8
<TD> <xsl:value-of select="author"/> <BR/> (год рождения <xsl:value-of select="author/@ГодРождения"/>) </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>
Э
та таблица стилей связана с
X
-д
окументом
ML
talogXSL06.xml
Ca
и отображает все имеющиеся в наличии книги из каталога, для которых атрибут
!-- Листинг: файл CatalogXSL06.xml-->
< <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="CatalogXSL06.xsl"?> <inventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="CatalogXSL06.xsd"> <book InStock="yes"> <title>Приключения Гекльберри Финна</title> <author ГодРождения="1835">Марк Твен</author> <binding>прошитый бумажный переплет</binding> <pages>298</pages> <price>$5.49</price> </book>
In
Stock
и
меет значение
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
<book InStock="no">
.
es'
'y
<title>Moby-Dick</title> <author ГодРождения="1877">Herman Melville</author> <binding>твердый переплет</binding> <pages>724</pages> <price>$9.95</price> </book>
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
<book InStock="yes"> <title>The Turn of the Screw</title>
14
9
<author ГодРождения="1878">Henry James</author> <binding>картонный переплет</binding> <pages>384</pages> <price>$3.35</price> </book> </inventory>
аждый элемент
К
имеющий значение
"y
book
es"
в
и
ствие книги в хранилище.
Каждый элемент
uthor
a
год рождения автора.
XML
ли
и
окументе содержит атрибут
-д указывающий наличие или отсут-
,
"n
o"
меет атрибут
дРождения
Го
InStock
,
содержащий
,
Рис. 4.9 Отображение элементов book в виде таблицы
Вместо отображения значения атрибута
In
Stock
т
аблица стилей использует атрибут в условии фильтрации с целью избежать отображения элементов
для книг, которых нет в наличии:
ok
bo
15
0
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]