Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Распред-ые СОИ.doc
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
591.87 Кб
Скачать

С чего начать

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

 

Рис 1

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

Структура xsl- таблиц

Рассмотрим основные структурные элементы XSL, используемые, в частности, в конверторе msxsl, для создания оформления XML-документов.

Правила xsl

XSL- документ представляет собой совокупность правил построения, каждое из которых выделено в отдельный блок, ограниченный тэгами <rule> и </rule>;. Правила определяют шаблоны, по которым каждому элементу XML ставится в соответствие последовательность HTML- тэгов, т.е. внутри них содержатся инструкции, определяющие элементы XML- документа и тэги форматирования, применяемые к ним.

Элементы XML, к которым будет применяться форматирование, обозначаются в XSL дескриптором <target-element/>;. Для указания элемента с конкретным названием (название элемента определяется тэгами, его обозначающими), т.е. определения класса элемента, можно использовать атрибут type="<имя_элемента>"

Вот пример простейшего XSL-документа, определяющего форматирование для фрагмента <flower>rose</flower> :

<xsl>

<rule>

<target-element type="flower"/>

<p color="red" font-size="12">

<children/>

</p>

</rule>

</xsl>

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

Инструкция <target-element> указывает на то, что данное правило определяет элемент. Параметром type="flower" задается название XML-элемента, для которого будет использоваться это правило. Программа-конвертор будет использовать HTML-тэги, помещенные внутри блока <rule></rule> для форматирования XML-элемента, которому "предназначался" текущий блок. В том случае, если для какого-то элемента XML шаблон не определяется, в выходной документ будут добавлены тэги форматирования по умолчанию (например, <DIV></DIV> )

Процесс разбора XSL-правил является рекурсивным, т.е. если у элемента есть дочерние элементы, то программа будет искать определения этих элементов, расположенных "глубже" в дереве документа. Указанием на то, что необходимо повторить процесс разбора XML документа, теперь уже для дочерних элементов, является инструкция <children/>. Дойдя до нее, анализатор выберет из иерархического дерева XML- элементов нужную ветвь и найдет в XSL-шаблонах правила, определяющие форматирование этих нижележащих элементов. В том случае, если вместо <children> мы укажем инструкцию <empty/>;, программа закончит движение по данной ветви и возвратится назад, в родительское правило. При этом текущее правило никакой информации в выходном HTML-документе изменять не будет, т.к. <empty/> в данном случае означает, что содержимое элемента отсутствует.

Если в одном правиле <target-element> используется несколько раз, то инструкции по форматированию будут распространены на все описываемые внутри него XML-элементы, т.е. можно задавать единый шаблон форматирования для нескольких элементов одновременно:

<xsl>

<rule>

<target-element type="item1"/>

<target-element type="item2"/>

<target-element type="item3"/>

<hr>

<children/>

<hr>

</rule>

</xsl>

Ниже приведен пример более сложного XSL- описания, некоторые фрагменты которого будут пояснены позже.

XML-документ:

<?XML Version="1.0"?>

<documents>

<books>

<book id="Book1">

<title>Макроэномические показатели экономики Римской Империи в период ее расцвета</title>

<author>Иван Петров</author>

<date>21.08.98</date>

</book>

<book id="Book2">

<title>Цветоводство и животноводство. Практические советы</title>

<author>Петр Сидоров</author>

<date>10.10.98</date>

</book>

</books>

<articles>

<article id="Article1">

<author>Петр Иванов</author>

<title>Влияние повышения тарифов оплаты за телефон на продолжительность жизни населения</title>

<date>12.09.98</date>

</article>

</articles>

</documents>

Содержимое XSL-документа:

<xsl>

<rule>

<root/>

<HTML>

<BODY bgcolor="white">

<center><hr width="80%"/><b>Library</b><hr width="80%"/><br/>

<table width="80%" border="2">

<children/>

</table></center>

</BODY>

</HTML>

</rule>

<rule>

<element type="book">

<target-element type="author"/>

</element>

<td align="center">

<p color="red" font-size="14"> <b>

<children/>

</b></p></td>

</rule>

<rule>

<element type="article">

<target-element type="author"/>

</element>

<td align="center">

<p color="red" font-size="14" font-style="italic"><children/></p></td>

</rule>

<rule>

<target-element type="book"/>

<tr><children/></tr>

</rule>

<rule>

<target-element type="article"/>

<tr><children/></tr>

</rule>

<rule>

<target-element/>

<td align="center"><p><children/></p></td>

</rule>

<rule>

<target-element type="books"/>

<tr><td colspan="3" bgcolor="silver" >Books</td></tr>

<children/>

</rule>

<rule>

<target-element type="articles"/>

<tr><td colspan="3" bgcolor="silver" >Articles</td></tr>

<children/>

</rule>

</xsl>