Почему при использовании скриптов, приведенных в курсе Основы XML лекция Лекция 8: Отображение XML-документов с использованием связывания данных не происходит связывания XLM документа с HTML? Отображаются пустые поля. Браузер IE11 |
Отображение XML-документов с использованием XSL-таблиц стилей
Доступ к атрибутам XML
XSL трактует атрибут, принадлежащий элементу в XML-документе, как дочерний элемент. Однако для ссылки на атрибут в образце XSL вы должны предварить имя атрибута символом @, что указывает на то, что имя относится к атрибуту, а не к элементу.
Например, фильтр в следующем начальном теге выделяет все элементы BOOK с атрибутом InStock, имеющем значение "yes". Другими словами, он выбирает только книги, которые имеются в наличии:
<xsl:for-each select="INVENTORY/BOOK[@InStock='yes']">
Вы можете использовать XSL-элемент value-of для извлечения значений атрибута точно так же, как вы это делаете для извлечения текстового содержимого элемента. Например, следующий элемент value-of получает значение атрибута Born, принадлежащего элементу AUTHOR:
<xsl:value-of select="AUTHOR/@Born"/>
Таблица стилей, представленная в Листинге 10.8, демонстрирует технику доступа к атрибутам, принадлежащим элементам в XML-документе. Эта таблица стилей связана с XML-документом из Листинга 10.9 и отображает все имеющиеся в наличии книги из каталога.
<?xml version="1.0"?> <!-- File name: XslDemo06.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <H2>Books In Stock</H2> <TABLE BORDER="1" CELLPADDING="5"> <THEAD> <TH>Title</TH> <TH>Author</TH> <TH>Binding Type</TH> <TH>Number of Pages</TH> <TH>Price</TH> </THEAD> <xsl:for-each select="INVENTORY/BOOK[@InStock='yes']"> <TR ALIGN="CENTER"> <TD> <xsl:value-of select="TITLE"/> </TD> <TD> <xsl:value-of select="AUTHOR"/> <BR/> (born <xsl:value-of select="AUTHOR/@Born"/>) </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>Листинг 10.8. XslDemo06.xsl
<?xml version="1.0"?> <!-- File name: XslDemo06.xml --> <?xml-stylesheet type="text/xsl" href="XslDemo06.xsl"?> <INVENTORY> <BOOK InStock="yes"> <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> <BOOK InStock="no"> <TITLE>Leaves of Grass</TITLE> <AUTHOR Born="1819">Walt Whitman</AUTHOR> <BINDING>hardcover</BINDING> <PAGES>462</PAGES> <PRICE>$7.75</PRICE> </BOOK> <BOOK InStock="yes"> <TITLE>The Marble Faun</TITLE> <AUTHOR Born="1804">Nathaniel Hawthorne</AUTHOR> <BINDING>trade paperback</BINDING> <PAGES>473</PAGES> <PRICE>$10.95</PRICE> </BOOK> <BOOK InStock="yes"> <TITLE>Moby-Dick</TITLE> <AUTHOR Born="1819">Herman Melville</AUTHOR> <BINDING>hardcover</BINDING> <PAGES>724</PAGES> <PRICE>$9.95</PRICE> </BOOK> </INVENTORY>Листинг 10.9. XslDemo06.xml
Каждый элемент BOOK в XML-документе содержит атрибут InStock, имеющий значение "yes" или "no", указывающий наличие или отсутствие книги на складе. Каждый элемент AUTHOR имеет атрибут Born, содержащий год рождения автора.
Вместо отображения значения атрибута InStock таблица стилей использует атрибут в условии фильтрации с целью избежать отображения элементов BOOK для книг, которых нет в наличии:
<xsl:for-each select="INVENTORY/BOOK[@InStock='yes']"> <!-- отображение каждого элемента BOOK --> </xsl:for-each>
Таблица стилей отображает каждый элемент BOOK в виде HTML-таблицы, а не через список элементов SPAN, как в предыдущих примерах. Она отображает значение атрибута Born после значения элемента AUTHOR, используя XSL-элемент value-of. Следующие элементы создают ячейку таблицы для отображения этих значений:
<TD> <xsl:value-of select="AUTHOR"/> <BR/> (born <xsl:value-of select="AUTHOR/@Born"/>) </TD>
На рисунке 10.7 показано как Internet Explorer 5 отображает документ.