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

6.15. Связывание html-элементов с xml-атрибутами

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

При связывании данных атрибут трактуется как дочерний элемент.

Для элемента record такая трактовка облегчает доступ (или позволяет игнорировать) к атрибуту. Например, следующая запись BOOK содержит атрибут с именем InStock:

<BOOK InStock =”да”>

<TITLE>Приключения Гекльбери Финна<TITLE>

<AUTHOR>Марк Твен</AUTHOR>

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

<PAGES>298</PAGES>

<PRICE>$5.49</PRICE>

</BOOK>

Эта запись трактуется так, как если бы атрибут InStock был полем, принадлежащим BOOK, а значение InStock было бы содержимым этого поля. Таким образом, элемент BOOK воспринимался бы в соответствии со следующей структурой:

<BOOK>

<InStock>да</InStock>

<TITLE>Приключения Гекльбери Финна<TITLE>

<AUTHOR>Марк Твен</AUTHOR>

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

<PAGES>298</PAGES>

<PRICE>$5.49</PRICE>

</BOOK>

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

<SPAN DATASRC="#dsoInventory" DATAFLD="InStock"></SPAN>

(В этом примере предполагается, что XML-документ связан со страницей через фрагмент данных с именем dsoInventory.)

Следует учитывать, однако, что при добавлении атрибута к одному из элементов-полей в XML-документе, например, добавлении атрибута к полю AUTHOR,

<ВООК>

<TITLE>Приключения Гекльбери Финна<TITLE>

<AUTHOR Born=”1835”>Марк Твен</AUTHOR>

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

<PAGES>298</PAGES>

<PRICE>$5.49</PRICE>

</BOOK>

после связывания данных элемент AUTHOR будет интерпретирован следующим образом:

<AUTHOR>

<Born>1835</Born>

Марк Твен

</AUTHOR>

В результате DSO будет хранить элемент как вложенную запись, а не как поле. (Напомним, что поля элементов могут содержать только символьные данные, но не дочерние элементы.) Следовательно, набор записей превратится в иерархический набор, а не в простой набор записей, и придется отображать вложенные записи с использованием вложенной таблицы, как описано в разделе “Использование вложенной таблицы для отображения иерархической структуры записей” ранее в этой главе.

Чтобы иметь возможность отобразить как символьные данные (Марк Твен), так и атрибут как вложенную запись, следует иметь в виду то обстоятельство, что DSO использует специальное имя $ТЕХТ для обращения ко всем символьным данным элемента, не включая при этом значений атрибута. Так, элемент AUTHOR будет интерпретирован следующим образом:

<AUTHOR>

<Born>1835</Born>

<$TEXT>Марк Твен</$TEXT>

</AUTHOR>

Можно использовать имя $ТЕХТ в качестве имени поля, чтобы связать ячейку таблицы с символьными данными, содержащимися в записи AUTHOR.

В Листинге 1.24 представлена HTML-страница, демонстрирующая все рассмотренные в этом разделе приемы. Данная HTML-страница позволяет отобразить XML-документ, представленный в листинге 1.25.

<HTML>

<HEAD>

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

</HEAD>

<BODY>

<XML ID="dsoInventory" SRC="Inventory05.xml"></XML>

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

<TABLE DATASRC="#dsoInventory" BORDER="1" CELLPADDING="5">

<THEAD>

<ТН>Заголовок</TH>

<ТН>Автор</TH>

<ТН>Обложка</TН>

<ТН>Страниц</TH>

<TH>Цена</TH>

<TH>Наличие</TH>

</THEAD>

<TR ALIGN="center">

<TD>

<TABLE DATASRC="#dsoInventoiy DATAFLD="TITLE">

<TR>

<ТD><SPAN DATASRC="$ТЕХT"></SРАN></TD>

</TR>

</TABLE>

</TD>

<TD>

<TABLE DATASRC="#dsoInventory" DATAFLD="AUTHOR">

<TR>

<TD><SPAN DATAFLD="$ТЕХT></SPAN></TD>

<TD><SPAN DATAFLD="Country"></SPAN></TD>

</TR>

</TABLE>

</TD>

<TD><SPAN DATAFTD="BINDING"></SPAN></TD>

<ТD><SPAN DАTAFLD="РАGЕS"></SPAN></TD>

<ТD><SPAN DATAFLD="PRICE"></SPAN></TD>

<TD><SPAN DATAFLD="Наличие"></SPAN></TD>

</TR>

</TABLE>

</BODY>

</HTML>

Листинг 1.24

<?xml version=”1.0”?>

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

<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.25

На следующем рисунке, показано как Internet Explorer при помощи HTML-документа из листига 1.24 отобразит XML-документ из листинга 1.25.

На этой странице в последнем столбце внешней таблицы отображены значения атрибута InStock записи BOOK путем обычного сцепления его с элементом SPAN:

<TD><SPAN DATAFLD="InStock"></SPAN></TD>

Поскольку дочерний элемент AUTHOR элемента BOOK содержит атрибут (Country), он интерпретируется как вложенная запись, а не как поле, поэтому страница отображает его с помощью вложенной таблицы:

<TD>

<TABUE DATASRC="#dsoInventory" DATAFLD="AUTHOR">

<TR>

<TD><SPAN DATAFLD="$TEXT"></SPAN</TD>

<TD><SPAN DATAFLD="Country"></SPAN></TD>

<TR>

</TABLE>

</TD>

Рисунок 44. Отображение атрибутов элементов XML-документа

Специальное имя $ТЕХТ ссылается на весь текст внутри элемента AUTHOR, не включая значения атрибута. Этот текст состоит из имени автора (например, Лев Толстой).

Заметим, что поскольку элемент TITLE в BOOK может включать дочерний элемент (SUBTITLE), он также интерпретируется как вложенная запись, а не как поле, и должен также быть отображен с использованием вложенной таблицы:

<TD>

<TABLE DATASRC="#dsoInventory" DATAFLD="TITLE">

<TR>

<TD><SPAN DATAFLD="$TEXT"></SPAN></TD>

</TR>

</TABLE>

</TD>

Здесь $ТЕХТ используется для отображения всех символьных данных записи. (Нельзя установить связь только с текстом заголовка, не включая подзаголовка.)