Почему при использовании скриптов, приведенных в курсе Основы XML лекция Лекция 8: Отображение XML-документов с использованием связывания данных не происходит связывания XLM документа с HTML? Отображаются пустые поля. Браузер IE11 |
Отображение 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.
На этой странице в последнем столбце внешней таблицы отображены значения атрибута 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 используется для отображения всех символьных данных записи. (Нельзя установить связь только с текстом заголовка, не включая подзаголовка.)