Закрытая и открытая модели описания содержимого элемента
Когда определяется модель содержимого текущего элемента, список дополнительных допустимых элементов правилами не ограничивается, т.е. документ может свободно расширяться. Например, кроме обозначенных элементов <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=""/>