Опубликован: 08.08.2007 | Уровень: для всех | Доступ: платный
Лекция 12:

Лабораторная работа № 2

Определение сложных типов

Тип элемента называется сложным, если в элемент вложены другие элементы и/или в открывающем теге элемента есть атрибуты.

Сложный тип определяется компонентом complexType, имеющим вид:

<xsd:complexType name="имя типа" >

Определение типа

</xsd:complexType>

Необязательный атрибут name задает имя типа, а в содержимом компонента complexType описываются элементы, входящие в сложный тип, и/или атрибуты открывающего тега.

Определение сложного типа можно разделить на три группы:

  1. определение типа пустого элемента (элемента, не содержащего тела, а содержащего только атрибуты в открывающем теге).

    Каждый атрибут объявляется одним компонентом attribute, например:

    <xsd:complexType name="imageType">
    <xsd:attribute name="href" type="xsd:anyURI" />
    </xsd:complexType>
  2. определение типа элемента с простым телом (элемента, содержащего тело простого типа и атрибуты в открывающем теге).

    Этот тип отличается от простого типа только наличием атрибутов и определяется компонентом simpleContent. В теле этого компонента должен быть либо компонент restriction, либо компонент extension. Атрибутом base задают тип (простой) тела описываемого элемента.

    В компоненте extension указываются атрибуты открывающего тега описываемого элемента.

    В компоненте restriction, кроме атрибутов, описывается простой тип содержимого элемента и/или фасетки, ограничивающие тип, заданный атрибутом base.

  3. определение типа элемента, содержащего вложенные элементы.

    Если значениями определяемого сложного типа будут элементы, содержащие вложенные элементы, то перед тем, как перечислять их описания, надо выбрать модель группы (model group) вложенных элементов. Дело в том, что вложенные элементы, составляющие определяемый тип, могут появляться или в определенном порядке, или в произвольном порядке, кроме того, можно выбирать только один из перечисленных элементов. Эта возможность и называется моделью группы элементов. Она определяется одним из трех компонентов: sequence, all или choice.

    Компонент sequence применяется в том случае, когда перечисляемые элементы должны записываться в документе в определенном порядке.

    Если же вместо компонента xsd:sequence записать компонент xsd:all, то элементы можно перечислять в любом порядке.

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

  4. Определение типа элемента со сложным телом

    При определении сложного типа можно воспользоваться уже определенным, базовым, сложным типом, расширив его дополнительными элементами, или, наоборот, удалив из него некоторые элементы. Для этого необходимо применить компонент complexContent. В этом компоненте, так же как и в компоненте simpleContent, записывается либо компонент extension, если надо расширить базовый тип, либо компонент restriction, если нужно его сузить. Базовый тип указывается атрибутом base, так же как и при записи компонента simpleContent, но теперь это должен быть сложный, а не простои тип. При сужении базового типа компонентом restriction надо перечислить те элементы, которые останутся после сужения.

Преобразование документов средствами XSLT

Язык преобразований XSLT - это одна из реализации XML. Все элементы XML, объявленные в языке XSLT, относятся к пространству имен http://www.w3.org/1999/XSL/Transform. Обычно они записываются с префиксом xsl. Если принят этот префикс, то корневой элемент документе XSLT - таблицы стилей- будет называться xsl:stylesheet у которого есть один обязательный атрибут version, указывающий версию языка.

Таблицу стилей можно записать в файл с расширением xsl. Ссылку на таблицу стилей можно поместить в документ XML как одну из инструкций по обработке, а именно инструкцию xml-stylesheet. Пример такой ссылки приведен ниже.

<?xml version="1.0"" encoding="windows-1251" ?>
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>
<book>
<!-- содержание -->
</book>

"Увидев" инструкцию по обработке xml-stylesheet, программа-обработчик XML, если она, кроме того, является процессором XSLT, выполнит преобразование, заданное в таблице стилей.

Так же таблицу стилей можно записывать не в отдельный файл, а непосредственно в преобразуемый документ XML. Для этого в элементе xsl:stylesheet предусмотрен атрибут-идентификатор id, на который можно ссылаться обычным образом из инструкции по обработке xml-stylesheet.

<?xml version="1.0" encoding="windows-1251" ? >
<?xml-stylesheet type="text/xsl" href=v#simple"?>
<book>
<xsl:stylesheet version="1.0" id="simple" 
                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- преобразования -->
</xsl:stylesheet>
<!-- содержание -->
</book>

Рассмотрим некоторые элементы языка XSLT.

Декларация xsl:import

Элемент xsl:import записывается очень просто:

<хsl:import href="адрес URI таблицы стилей" />

Его можно записать только непосредственно в корневом элементе xsl:stylesheet и только в самом начале таблицы стилей. Элементов xsl: import может быть несколько.

Процессор XSLT отыскивает таблицу стилей по указанному атрибутом href адресу и подставляет ее на место элемента xsl:import перед преобразованием.

Некоторые правила преобразования из таблиц, импортируемых элементами xsl:import, могут конфликтовать с правилами, импортированными из других таблиц или определенными в самой таблице стилей. В таком случае чаще всего применяются те правила, которые записаны последними. Поэтому порядок записи элементов xsl:import в таблицу стилей имеет большое значение.

Декларация xsl:include

Второй элемент, включающий внешние таблицы стилей в данную таблицу, - это элемент xsl:include. Он записывается точно так же, как элемент xsl:import, и оказывает такое же действие:

<xsl:include href="адрес URI таблицы стилей" />

Его можно записать не только непосредственно в корневом элементе xsl:stylesheet, но, в отличие от элемента xsl:import, в любом месте таблицы стилей. Второе отличие от элемента xsl:import заключается в том, что порядок записи элементов xsl:include в таблице стилей не имеет значения.

Декларация xsl:variable

Элемент xsl:variable определяет имя объекта. Оно записывается обязательным атрибутом name. Имя объекта должно быть уточненным именем XML типа QName. Кроме того, атрибутом select переменной можно задать сам объект, а атрибутом as определить тип объекта. Например:

<xsl:variable name="var1" select="count(//person) " as="xs:integer" />

Имя var1 будет хранить число элементов person. Объект может быть получен из содержимого элемента xsl: variable:

<xsl: variable name="var2">10</xsl:variable>

или создан конструктором последовательности:

<xsl:variable name="var3">
<xsl:value-of select="count (//person) " /> 
<xsl:variable>

Если объект не получен из атрибута select или содержимого элемента xsl: variable, то по умолчанию имя связывается с пустой строкой.

Для того чтобы получить объект, связанный с именем, определенным элементом xsl: variable, перед именем надо поставить знак доллара: $varl, $var2. При этом следует учитывать область действия имени.

Область действия имени простирается на весь элемент, в котором оно определено, начиная с места определения и включая вложенные элементы, если только в них не определено то же самое имя.

Имена, определенные непосредственно в корневом элементе xsl:stylesheet, называются глобальными именами, остальные - локальными именами.

Хотя слово "variable" и переводится с английского языка как "переменная", имя, созданное элементом xsl: variable - это не имя переменной, его значение нельзя изменить. Это только название некоторого объекта, которое удобно использовать в тех случаях, когда объект надо использовать во многих местах таблицы стилей, а его вычисление сложно или громоздко.

Декларация xsl:param

Элемент xsl:param записывается или непосредственно в элементе xsl:stylesheet, чтобы задать параметр преобразования, или в элементе xsl:template, чтобы задать параметр правила, или в элементе xsl:function как аргумент функции. У него один обязательный атрибут name, определяющий имя параметра. Кроме него, часто присутствует необязательный атрибут select, в котором записывается выражение для получения значения параметра:

<xsl:param name="pl" select="10 + 20" />

Если атрибут select отсутствует, то значение параметра берется из содержимого элемента, которым может быть конструктор последовательности узлов и атомарных значений:

<xsl:param name="p2">10</xsl:param>

Если отсутствует и атрибут select, и содержимое элемента, то параметр получает значение пустой строки.

Дли получении значения параметра надо записывать его имя со знаком доллара: $p1, $p2. Например:

<xsl:when test= "$p1=10 ">

Правила, определяющие область видимости параметров, такие же, как и у имен объектов, определенных декларацией xsl:variable.

Еще один необязательный атрибут as содержит желательный тип, к которому будет приведено значение параметра.

Наконец, последний атрибут required, принимающий значения yes или nо (по умолчанию), указывает обязательность параметра. Если параметр обязателен, required="yes", то элемент xsl:param должен быть пустым и не содержать атрибут select. В таком случае он получит определенное значение при вызове функции или элементом xsl:with-param при вызове шаблона.

Вадим Новицкий
Вадим Новицкий
Беларусь, Минск
Trololo Пукпрук
Trololo Пукпрук
Беларусь