Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4_XML_-_lektsii.doc
Скачиваний:
3
Добавлен:
25.08.2019
Размер:
221.7 Кб
Скачать

Стилевые xsl таблицы

Стилевыми таблицами - листами XSL (Extensible Style Language) принято называть специальные инструкции, управляющие процессом отображения элемента в окне программы-клиента (например, в окне броузера). Для форматирования XML- элементов был разработан новый язык разметки, являющийся подмножеством XML, и специально был предназначен для форматирования XML- элементов.

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

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

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

Правила XSL

XSL- документ представляет собой совокупность правил построения, каждое из которых выделено в отдельный блок, ограниченный парой тэгов <xsl:template> и </xsl:template>.

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

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

<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">

<HTML>

<BODY STYLE="font-family:Arial, helvetica, sans-serif; font-size:12pt;

background-color:#EEEEEE">

<xsl:for-each select="breakfast-menu/food">

<DIV STYLE="background-color:teal; color:white; padding:4px">

<SPAN STYLE="font-weight:bold; color:white"><xsl:value-of select="name"/></SPAN>

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

</DIV>

<DIV STYLE="margin-left:20px; margin-bottom:1em; font-size:10pt">

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

<SPAN STYLE="font-style:italic">

(<xsl:value-of select="calories"/> calories per serving)

</SPAN>

</DIV>

</xsl:for-each>

</BODY>

</HTML>

</xsl:template>

</xsl:stylesheet>

В приведенном примере можно проследить особенность использования стилевых таблиц:

  • соответствующими элементами декларативно задается область, которая определяет фрагмент XML-документа;

  • программа-анализатор заново проходит все элементы, начиная с текущего, всякий раз, когда в структуре XML- документа обнаруживаются новые вложенные элементы;

  • инструкция <xsl:value-of select=""/> указывает на то, что данное правило определяет элемент;

  • параметром select="" задается название XML-элемента, для которого будет использоваться это правило;

  • программа-конвертор будет использовать HTML-тэги, помещенные внутри блока <xsl:template></xsl:template> для форматирования XML-элемента, которому "предназначался" текущий блок;

  • в том случае, если для какого-то элемента XML шаблон не определяется, в выходной документ будут добавлены тэги форматирования по умолчанию (например, <DIV></DIV>);

  • внутри шаблона можно задавать элементы, которые подлежат разбору и оформлению в соответствии с шаблоном. Для этой цели служит конструкция <xsl:for-each select="">, где атрибутом select="" задается элемент xml-документа, который подлежит выборке и рекурсивному разбору.

Корневое правило

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

Для обозначения корневого правила необходимо включить в него элемент <xsl:template match="/">. Внутри этой конструкции необходимо описать те теги HTML, при помощи которых будет форматироваться страница.

В приведенном выше примере определён ряд HTML-тэгов, между которыми затем в процессе рекурсивного обхода XSL- анализатора будут помещены остальные элемента документа.

В том случае, если мы не определяем правило для корневого элемента, разбор документа начнется с первого правила с инструкцией <xsl:value-of select=""/>

Отношения между элементами

Дочерние элементы в XML-документе всегда находятся внутри области, определяемой тэгами родительского по отношению к ним элемента. Для того, чтобы точно указать месторасположение обрабатываемого элемента в дереве XML, в XSL используется конструкция <xsl:value-of select="element1/element2/title"/>. Последовательность описания элементов указывает на то, из какого места xml-документа необходимо извлечь данные.

Приоритеты правил

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

В общем случае приоритет правил определяется в порядке убывания приоритета:

  • правила, помеченные специальным тэгом <importance>;

  • правила с наибольшим значением атрибута id, если он определен;

  • правила с наибольшим значением атрибута class, если он определен;

  • правила, имеющие наибольшую вложенность;

  • правила с более высоким приоритетом, задаваемым атрибутом priority;

  • правила с наибольшим значением квалификаторов <only>, <position>, <attribute>.

Сценарии

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

Для написания сценариев XSL использует специальный скриптовый язык - ECMAScript. Однако для этих целей можно применять Microsoft JavaScript,- язык, который объединил в себе некоторые элементы стандартного языка JavaScript и ECMAScript.

Вычисление выражений

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

<rule>

<target-element type="header">

<hr width="=100-20+'%'">

<children/>

<hr width="80%">

</rule>

в выходном документе окажутся следующие инструкции:

<hr width=80%>

<hr width=80%>

Довольно часто в правилах XSL необходимо использовать атрибуты описываемого в них элемента. Для этого необходимо воспользоваться методом getAttribute(), описанным в объектной модели XML. Вследствие того, что каждому элементу XSL доступен указатель на соответствующий ему объект, сценарий может обращаться к внутренним функциям и свойствам этих элементов, при помощи которых и осуществляются необходимые действия.

В следующем фрагменте XML- документа определяется элемент <article>, в котором атрибут src используется для задания адреса файла, содержащего текст статьи.

<articles>

<article src="http://server/pages/article.html">Bugs report</article>

</articles>

Для того, чтобы использовать этот атрибут в выходном HTML-документе, необходимо определить следующее правило:

<rule>

<target-element type="article">

<a href='=getAttribute("src")'>

<children/>

</a>

</rule>

После обработки этого фрагмента в выходной документ будет помещен элемент:

<a href="http://server/pages/article.html">Bugs report</a>

Выполнение инструкций

Другим способом помещения в выходной HTML- документ информации, являющейся результатом выполнения каких-либо операций JavaScript - сценариев является использование инструкции <eval>:

<rule>

<element type="articles">

<target-element type="article">

</element>

<tr><td><eval>childNumber(this)</eval></td><td>

<children/>

</td><tr>

</rule>

Метод childNumber в данном случае возвращает текущий номер дочернего элемента.

Использование Java Script для HTML

Создавая шаблон HTML-документа, можно указывать в нем практически любые элементы HTML, в том числе и блоки <SCRIPT>, внутри которых возможно задавать любые конструкции языка Java Script, используя для этого область CDATA, напимер:

<xsl>

<rule>

<root/>

<HTML>

<HEAD>

<SCRIPT LANGUAGE="JSCRIPT"><![CDATA[var ie4= (( navigator.appName

=="Microsoft Internet Explorer")

&&(parseInt(navigator.appVersion) >= 4 ));

function msover()

{

if (ie4){

event.srcElement.style.color="red";

event.srcElement.style.cursor = "hand";

}

}

function msout(){

if (ie4){

event.srcElement.style.color="black";

event.srcElement.style.cursor = "auto";

}

} ]]></SCRIPT>

</HEAD>

<BODY>

<children/>

</BODY>

</HTML>

</rule>

<rule>

<target-element type="chapter"/>

<DIV id='=tagName + formatNumber(childNumber(this),"1")'

background-color="marron" onmouseover='="msover("+ tagName +

formatNumber(childNumber(this),"1")+")"' onmouseout='="msout("+ tagName +

formatNumber(childNumber(this),"1")+")"'

<children/>

</DIV>

</rule>

</xsl>

27