Закрытая и открытая модели описания содержимого элемента

Когда определяется модель содержимого текущего элемента, список дополнительных допустимых элементов правилами не ограничивается, т.е. документ может свободно расширяться. Например, кроме обозначенных элементов <tel>,<url> и <email> вполне могут использоваться дополнительные элементы, неописанные правилами, например, <fax>:

<contacts>

<tel>12-12-12</tel>

<fax>21-21-21</fax>

<email>[email protected]</email>

<url>http://www.j.com</url>

</contacts>

Однако в том случае, если необходимо ограничить создаваемые правила от возможности включения дополнительных элементов, требуется использовать атрибут content и установить для него специальное значение CLOSED:

<elementType id="contacts" content="CLOSED">

<element type="#tel">

<element type="#email">

<element type="#url">

</elementType>

Иерархия классов

Для того, чтобы при описании класса ограничить список объектов, которые могут являться родительскими для данного элемента, необходимо использовать элемент схемы domain.

Инструкция <domain> указывает, что текущий объект должен определяться строго внутри элемента, заданного этим тэгом. Например, в следующем фрагменте указывается, что элемент <author> может быть определен строго внутри тэга <article>:

<elementType id="author">

<element type="#lastname">

<element type="#firstname">

<domain type="#article"/>

</elementType>

Ограничения на значения

Значения элементов могут быть ограничены при помощи тэгов <min> и <max>;:

<elementType id="room">

<element type="#floor"><min>0</min><max>100</max>

</elementType>

Внутри этих элементов могут указываться и символьные ограничения:

<elementType id="line">

<element type="#character"><min>A</min><max>Z</max>

</elementType>

Использование правил из внешних схем

Схема может использовать элементы и атрибуты из других схем. Для этого необходимо использовать атрибут href, в котором указывается название внешней схемы:

<?XML version='1.0' ?>

<s:schema>

<elementType id="author">

<string/>

</elementType>

<elementType id="title">

<string/>

</elementType>

<elementType id="Book">

<element type="#title" occurs="OPTIONAL"/>

<element type="#author" occurs="ONEORMORE"/>

<element href="http://www.mysite.org/" /> </elementType></s:schema>

</elementType>

</s:schema>

Типы данных

В схемах существует возможность задавать тот или иной тип данных, используя при определении элемента директиву <datatype> с указанием конкретного типа:

<elementType id="counter">

<datatype dt="int">

</elementType>

Пространство имен XML-документов

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

Чтобы исправить эту ситуацию, разработчику необходимо определить уникальные названия элементов и их атрибутов, "дописывая" к их обычным именам некоторый универсальный неповторяющийся префикс. Для этого применяется механизм Namespaces.

Стилевые 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=""/>

Наши рекомендации