Опубликован: 24.01.2007 | Уровень: для всех | Доступ: платный
Лекция 8:

Отображение XML-документов с использованием связывания данных

Связывание HTML-элементов с XML-атрибутами

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

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

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

<BOOK InStock="yes">
  <TITLE>The Adventures of Huckleberry Finn</TITLE>
  <AUTHOR>Mark Twain</AUTHOR>
  <BINDING>mass market paperback</BINDING>
  <PAGES>298</PAGES>
  <PRICE>$5.49</PRICE>
</BOOK>

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

<BOOK>
  <InStock>yes</InStock>
  <TITLE>The Adventures of Huckleberry Finn</TITLE>
  <AUTHOR>Mark Twain</AUTHOR>
  <BINDING>mass market paperback</BINDING>
  <PAGES>298</PAGES>
  <PRICE>$5.49</PRICE>
</BOOK>

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

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

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

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

<BOOK>
  <TITLE>The Adventures of Huckleberry Finn</TITLE>
  <AUTHOR Born="1835">Mark Twain</AUTHOR>
  <BINDING>mass market paperback</BINDING>
  <PAGES>298</PAGES>
  <PRICE>$5.49</PRICE>
</BOOK>

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

<AUTHOR>
  <Born>1835</Born>
  Mark Twain
</AUTHOR>

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

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

<AUTHOR>
  <Born>1835</Born>
  <$TEXT>Mark Twain</$TEXT>
</AUTHOR>

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

В Листинге 8.14 представлена HTML-страница, демонстрирующая все рассмотренные в этом разделе приемы. Эта страница отображает XML-документ Inventory Valid.xml (см. Листинг 5.1).

<!-- Имя файла: Inventory Attribute.htm -->

<HTML>

<HEAD>
   <TITLE>Book Inventory</TITLE>
</HEAD>

<BODY>

   <XML ID="dsoInventory" SRC="Inventory Valid.xml"></XML>

   <H2>Book Inventory</H2>
   
   <TABLE DATASRC="#dsoInventory" BORDER="1" CELLPADDING="5">
      <THEAD>
         <TH>Title</TH>
         <TH>Author</TH>
         <TH>Binding</TH>
         <TH>Pages</TH>
         <TH>Price</TH>
         <TH>In Stock?</TH>
      </THEAD>     
      <TR ALIGN="center">
         <TD>
            <TABLE DATASRC="#dsoInventory" DATAFLD="TITLE">
            <TR>
               <TD><SPAN DATAFLD="$TEXT"></SPAN></TD>
            </TR>
            </TABLE>
         </TD>
         <TD>
            <TABLE DATASRC="#dsoInventory" DATAFLD="AUTHOR">
            <TR>
               <TD><SPAN DATAFLD="$TEXT"></SPAN></TD>
               <TD><SPAN DATAFLD="Born"></SPAN></TD>
            </TR>
            </TABLE>
         </TD>
         <TD><SPAN DATAFLD="BINDING"></SPAN></TD>
         <TD><SPAN DATAFLD="PAGES"></SPAN></TD>
         <TD><SPAN DATAFLD="PRICE"></SPAN></TD>
         <TD><SPAN DATAFLD="InStock"></SPAN></TD>
      </TR>
   </TABLE>

</BODY>

</HTML>
Листинг 8.14. Имя файла: Inventory Attribute.htm

На рисунке 8.8 показано как Internet Explorer 5 отобразит документ из Листинга 8.14.


Рис. 8.8.

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

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

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

<TD>
  <TABLE DATASRC="#dsoInventory" DATAFLD="AUTHOR">
  <TR>
    <TD><SPAN DATAFLD="$TEXT"></SPAN></TD>
    <TD><SPAN DATAFLD="Born"></SPAN></TD>
  </TR>
  </TABLE>
</TD>

Специальное имя $TEXT ссылается на весь текст внутри элемента AUTHOR, не включая значения атрибута. Этот текст состоит из имени автора (например, Mark Twain).

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

<TD>
  <TABLE DATASRC="#dsoInventory" DATAFLD="TITLE">
  <TR>
    <TD><SPAN DATAFLD="$TEXT"></SPAN></TD>
  </TR>
  </TABLE>
</TD>

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

Максим Попов
Максим Попов

Почему при использовании скриптов, приведенных в курсе Основы XML

лекция Лекция 8: 

Отображение XML-документов с использованием связывания данных

не происходит связывания XLM документа с HTML?

Отображаются пустые поля. Браузер IE11

Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Максим Самсоненко
Максим Самсоненко
Россия
Алексей Шибаев
Алексей Шибаев
Россия, г. Новошахтинск