Технология Microsoft ADO.NET

       

XSL и XSLT


Расширяемый язык таблиц стилей (Extensible Stylesheet Language) состоит из двух частей - языка форматирования и языка преобразований (трансформирования). Язык форматирования описывает таблицы стилей XSL, которые подобно таблицам каскадных стилей (CSS), отвечают за отображение в браузере документов XML. Язык преобразований (Extensible Stylesheet Language Transformations) отвечает за средства контроля над выводимыми данными, такими как сортировка, фильтрация, для этого он использует структуру (например, DTD) XML-документов. Таким образом, можно считать обе части одним единым языком - XSL. В литературе и Интернете на сегодняшний день наблюдается различие названий - под XSLT понимается язык XSL, под XSL понимается XSLT и в дополнении ко всем прочим названиям форматов XML это вносит изрядную путаницу. Далее мы будем называть рассматриваемый язык стилей XSL, подразумевая обе эти части.

Таблица XSL может содержать один или несколько шаблонов, описывающих документ XML. В таблице 10.7 приводится документ XMLTour.xml, соответствующая таблица стилей, содержащая один шаблон, и вид страницы в браузере.

Таблица 10.7. XSL-таблица с одним шаблоном

XML - документ, XMLTour.xmlXSL- таблица, XSLTour.xsl

<?xml version="1.0" encoding="utf-8" ?>

<?xml-stylesheet type="text/xsl" href="XSLTour.xsl"?>

<!-- Название файла XMLTour.xml -->

<TOUR> <IDTOUR>1</IDTOUR> <NAME>Кипр</NAME> <PRICE>25 000,00р.</PRICE> <INFORMATION>В стоимость двух взрослых путевок входит цена одной детской (до 7лет)</INFORMATION> </TOUR>

<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">

<H3>Таблица "Туры"</H3>

<SPAN STYLE="font-style:italic"> Код тура: </SPAN> <xsl:value-of select= "TOUR/IDTOUR"/><BR/> <SPAN STYLE= "font-style:italic">Название:</SPAN> <xsl:value-of select= "TOUR/NAME"/> <BR/> <SPAN STYLE= "font-style:italic"> Цена:</SPAN> <xsl:value-of select= "TOUR/PRICE"/><BR/> <SPAN STYLE= "font-style:italic">Информация:</SPAN> <xsl:value-of select= "TOUR/INFORMATION"/><BR/>

</xsl:template> </xsl:stylesheet>

Вид в браузере Internet Explorer
<


Для связывания XML-документа с таблицей XSL в прологе указывается ее адрес:

<?xml-stylesheet type="text/xsl" href="XSLTour.xsl"?>

Наиболее часто используется относительный URL - обычно таблица стилей располагается в одной папке с документами. При необходимости можно также указать полный адрес.

Таблица стилей представляет собой обычный текстовый файл с расширением *.xsl. После создания файла для подсветки синтаксиса его можно открыть с помощью Visual Studio .NET (среда содержит шаблон XSLT-документа, шаблонов XSL в ней нет). Первая строка XSL таблицы указывает на то, что это XML-документ:

<?xml version="1.0" encoding="UTF-8" ?>

И действительно, открывая файл файл XSLTour.xsl, в браузере устанавливаем, что это корректно сформированный документ с корневым элементом xsl:stylesheet (рис. 10.16):


увеличить изображение
Рис. 10.16.  Таблица XSL - корректно сформированный XML-документ

Этот элемент идентифицирует документ как таблицу стилей, он является одним из XSL-элементов специального назначения. Все XSL-элементы принадлежат пространству имен XSL - т.е. необходимо перед названием каждого XSL-элемента писать префикс xsl:, обозначающий пространство имен. Дополнительно указывается пространство имен для спецификации таблицы:

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"

Детали этого объявления не суть важны, главное, что нужно запомнить, - на сегодняшний день эта самая свежая версия спецификации. (Ранее применялась более старая спецификация http://www.w3.org/ TR/WD-xsl).

Корневой элемент xsl:stylesheet XSL-таблицы стилей должен содержать один или несколько шаблонов элементов. Корневой элемент из рассмотренного примера содержит только один шаблон, имеющий следующую структуру:

<xsl:template match="/"> <!--дочерние элементы... --> </xsl:template>

Браузер использует шаблон для отображения определенной ветви элементов в иерархии XML-документа, с которым связана таблица стилей. Атрибут match шаблона указывает на определенную ветвь. (Атрибут match представляет собой аналог селектора в правиле CSS).


Значение атрибута match носит название образца (pattern). Образец в данном примере ("/") представляет корневой элемент всего XML-документа. Этот шаблон, таким образом, включает в себя инструкции для отображения всего XML-документа. Шаблон содержит два вида элементов - HTML и XSL. К HTML-элементам относится заголовок <H3>Таблица "Туры"</H3> и описание названия записи <SPAN STYLE="font-style:italic">Код тура: </SPAN>. Это обычные HTML-элементы, единственное, что нужно делать при работе с ними - добавлять закрывающийся тег для всех элементов. Элементы XSL и отвечают за вывод содержимого XML-документа на web-страницу, - например, здесь выводится содержимое дочернего элемента IDTOUR, который принадлежит родительскому элементу TOUR:

<xsl:value-of select="TOUR/IDTOUR"/>

Порядок выводимых элементов определяется именно расположением XSL-элементов, например, если поменять строки, описывающие IDTOUR и NAME, то соответствующим образом изменится web-страница (рис. 10.17 ):

... <SPAN STYLE="font-style:italic">Название: </SPAN> <xsl:value-of select="TOUR/NAME"/> <BR/> <SPAN STYLE="font-style:italic">Код тура: </SPAN> <xsl:value-of select="TOUR/IDTOUR"/><BR/> <SPAN STYLE="font-style:italic"> Цена: </SPAN> <xsl:value-of select="TOUR/PRICE"/><BR/> <SPAN STYLE="font-style:italic">Информация: </SPAN> <xsl:value-of select="TOUR/INFORMATION"/><BR/> ...


Рис. 10.17.  Теперь сначала выводится название тура, а затем код

В программном обеспечении к курсу вы найдете файлы XMLTour.xml и XSLTour.xsl в папке SimpleXSL (Code\Glava5\XSL\SimpleXSL)

Рассмотрим теперь вывод переменного числа дочерних элементов, входящих в корневой элемент XML-документа. В таблице 10.8 приводится описание этой структуры.

Таблица 10.8. XSL-таблица с одним шаблоном и несколькими элементами. Фрагменты XSL-таблицы, одинаковые с таблицей XSLTour.xsl, выделены фоновым цветом.XML-документ, XMLTour2.xmlXSL-таблица, XSLTour2.xsl
<?xml version="1.0" encoding="utf-8" ?>

<!-- Название файла XMLTour.xml --> <?xml-stylesheet type="text/xsl" href="XSLTour2.xsl"?>

<TABLE> <TOUR> <IDTOUR>1</IDTOUR> <NAME>Кипр</NAME> <PRICE>25 000,00р. </PRICE> <INFORMATION>В стоимость двух взрослых путевок входит цена одной детской (до 7лет)</INFORMATION> </TOUR> <TOUR> <IDTOUR>2</IDTOUR> <NAME>Греция</NAME> <PRICE>32 000,00р. </PRICE> <INFORMATION>В августе и сентябре действуют специальные скидки</INFORMATION> </TOUR> <TOUR> <IDTOUR>3</IDTOUR> <NAME>Таиланд</NAME> <PRICE>30 000,00р.</PRICE> <INFORMATION>Не включая стоимость авиабилета</INFORMATION> </TOUR> <TOUR> <IDTOUR>4</IDTOUR> <NAME>Италия</NAME> <PRICE>26 000,00р.</PRICE> <INFORMATION>Завтрак в отеле включен в стоимость путевки</INFORMATION> </TOUR> <TOUR> <IDTOUR>5</IDTOUR> <NAME>Франция</NAME> <PRICE>27 000,00р.</PRICE> <INFORMATION>Дополнительные экскурсии не входят в стоимость путевки</INFORMATION> </TOUR> </TABLE>

<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/"> <H3>Таблица "Туры"</H3> <xsl:for-each select="TABLE/TOUR"> <BR/>

<SPAN STYLE= "font-style:italic" >Код тура: </SPAN> <xsl:value-of select= "IDTOUR"/><BR/> <SPAN STYLE= "font-style:italic">Название:</SPAN> <xsl:value-of select = "NAME"/> <BR/> <SPAN STYLE= "font-style:italic"> Цена: </SPAN> <xsl:value-of select= "PRICE"/><BR/> <SPAN STYLE="font-style:italic" >Информация:</SPAN> <xsl:value-of select= "INFORMATION"/><BR/> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Вид в браузере Internet Explorer
<


Для цикличного вывода содержимого дочернего элемента TOUR, принадлежащего элементу TABLE, используется элемент for-each:

<xsl:for-each select="TABLE/TOUR">

Далее, внутри for-each задается описание текущего элемента:

<xsl:for-each select="TABLE/TOUR"> <BR/> <SPAN STYLE="font-style:italic">Код тура: </SPAN> <xsl:value-of select="IDTOUR"/><BR/> ... </xsl:for-each>

В результате выводятся данные из всех элементов TOUR, найденных в документе, независимо от того, сколько этих элементов содержит документ.

В программном обеспечении к курсу вы найдете файлы XMLTour2.xml и XSLTour2.xsl в папке SomeElement (Code\Glava5\XSL\SomeElement).

Другой способ отображения повторяющихся XML-элементов состоит в создании отдельного шаблона для каждого элемента с последующим вызовом этого шаблона. Пример использования подобной методики приведен в таблице 10.9.

Таблица 10.9. XSL-таблица с двумя шаблонами и несколькими элементами. Фрагменты XSL-таблицы, одинаковые с таблицей XSLTour2.xsl, выделены фоновым цветом.XML-документ, XMLTour3.xmlXSL-таблица, XSLTour3.xsl


<?xml version="1.0" encoding="utf-8" ?>

<!-- Название файла XMLTour.xml --> <?xml-stylesheet type= "text/xsl" href="XSLTour3.xsl"?>

<TABLE> <TOUR> <IDTOUR>1</IDTOUR> <NAME>Кипр</NAME> <PRICE>25 000,00р. </PRICE> <INFORMATION>В стоимость двух взрослых путевок входит цена одной детской (до 7лет)</INFORMATION> </TOUR> <TOUR> <IDTOUR>2</IDTOUR> <NAME>Греция</NAME> <PRICE>32 000,00р. </PRICE> <INFORMATION>В августе и сентябре действуют специальные скидки</INFORMATION> </TOUR> <TOUR> <IDTOUR>3</IDTOUR> <NAME>Таиланд</NAME> <PRICE>30 000,00р.</PRICE> <INFORMATION>Не включая стоимость авиабилета</INFORMATION> </TOUR> <TOUR> <IDTOUR>4</IDTOUR> <NAME>Италия</NAME> <PRICE>26 000,00р.</PRICE> <INFORMATION>Завтрак в отеле включен в стоимость путевки</INFORMATION> </TOUR> <TOUR> <IDTOUR>5</IDTOUR> <NAME>Франция</NAME> <PRICE>27 000,00р.</PRICE> <INFORMATION>Дополнительные экскурсии не входят в стоимость путевки</INFORMATION> </TOUR> </TABLE>



<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/"> <H3>Таблица "Туры"</H3> <xsl:apply-templates select="TABLE/TOUR"/>

</xsl:template> <xsl:template match="TOUR">

<P> <SPAN STYLE= "font-style:italic">Код тура: </SPAN> <xsl:value-of select= "IDTOUR"/><BR/> <SPAN STYLE= "font-style:italic">Название:</SPAN> <xsl:value-of select = "NAME"/><BR/> <SPAN STYLE= "font-style:italic"> Цена: </SPAN> <xsl:value-of select= "PRICE"/><BR/> <SPAN STYLE= "font-style:italic">Информация:</SPAN> <xsl:value-of select= "INFORMATION"/><BR/> </P>

</xsl:template> </xsl:stylesheet>
<


Таблица стилей XSLTour3.xsl включает в себя два шаблона. Первый шаблон содержит инструкции для отображения коревого элемента - на это указывает атрибут match="/". Этот шаблон мы уже встречали ранее. Второй шаблон содержит инструкции для отображения элемента TOUR (атрибут match="TOUR"). Сначала браузер обрабатывает шаблон, соответствующий корневой части элемента:

<xsl:template match="/"> <H3>Таблица "Туры"</H3> <xsl:apply-templates select="TABLE/TOUR" />

</xsl:template>

Элемент apply-templates сообщает браузеру, что для каждого элемента TOUR внутри корневого элемента TABLE он должен обрабатывать шаблон, отвечающий элементу TOUR, - т. е. шаблон, для атрибута match которого установлено значение "TOUR". Далее описывается таблица стилей для этого элемента:

<xsl:template match="TOUR">

<P> <SPAN STYLE="font-style:italic">Код тура: </SPAN> <xsl:value-of select="IDTOUR"/><BR/> <SPAN STYLE="font-style:italic">Название: </SPAN> <xsl:value-of select = "NAME"/> <BR/> <SPAN STYLE="font-style:italic"> Цена: </SPAN> <xsl:value-of select="PRICE"/><BR/> <SPAN STYLE="font-style:italic">Информация: </SPAN> <xsl:value-of select="INFORMATION"/><BR/> </P>

</xsl:template>

Доступ к дочерним элементам TOUR осуществляется посредством образца, содержащего только имя элемента:

<xsl:value-of select="IDTOUR"/>

В программном обеспечении к курсу вы найдете файлы XMLTour3.xml и XSLTour3.xsl в папке SomeTemplate (Code\Glava5\XSL\ SomeTemplate).

Для создания таблиц XSL в среде Visual Studio .NET предусмотрен общий шаблон XSLT-документов. При запуске переходим в пункт главного меню "File \ New \ File" (см. рис. 10.3) и в появившемся списке шаблонов выбираем XSLT File. Сгенерированный текст содержит основные определения, для создания файла XSL следует лишь указать пространство имен XSL (таблица 10.10):

Таблица 10.10. Шаблоны XSLT и XSLXSLT-шаблон Visual Studio.NETXSL-таблица стилей
<?xml version="1.0" encoding="UTF-8" ?> <stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">

</stylesheet>



<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" version="1.0">

</xsl:stylesheet>

Содержание раздела