Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППТС-2 / Лекции / Lect4-04.doc
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
192 Кб
Скачать

4.2.8.3. Элементыkeyиkeyref

Элемент keyопределяет значение атрибута или элемента как ключ (ненулевой, уникальный и всегда присутствующий) в содержащем элементе формируемого документа. Элемент имеет следующий формат:

<префикс:key

id = ID

name = NCName

>

(annotation?, (selector, field+))

</префикс:key>

Атрибуты idиnameимеют тот же смысл, что и для элементаunique.

Пример использования элементов key, selector и field:

<xs:key name="fullName">

<xs:selector xpath=".//person"/>

<xs:field xpath="forename"/>

<xs:field xpath="surname"/>

</xs:key>

В этом примере поля "forename" и"surname" используются в качестве ключа с именемfullName.

Элемент keyrefопределяет, что значение атрибута или элемента соответствует значениям заданного ключа или уникального элемента и имеет следующий формат:

<префикс:keyref

id = ID

name = NCName

refer = QName

>

(annotation?, (selector, field+))

</префикс:keyref>

Атрибуты idиnameимеют тот же смысл, что и для элементаunique, а обязательный атрибутreferопределяет имя ключа или уникального элемента, определенного в данной или другой схеме.

Пример использования элементов keyref, selector и field:

<xs:keyref name="personRef" refer="fullName">

<xs:selector xpath=".//personPointer"/>

<xs:field xpath="@first "/>

<xs:field xpath="@last"/>

</xs:keyref>

В этом примере поля "@first" и"@last" соответствуют значениям ключа определенного выше элемента с именемfullName.

4.2.9. Определение комплексного типа в схемеXml

Комплексный элемент типа complexType– это элементXML, содержащий другие элементы и/или атрибуты. Существует четыре вида комплексных элементов:

  • пустые элементы;

  • элементы, содержащие только другие элементы;

  • элементы, содержащие только текст;

  • элементы, содержащие и другие элементы, и текст.

4.2.9.1. Формат определения элементаcomplexType

Определение комплексного типа имеет следующий формат:

<префикс:complexType

name = NCName

id = ID

abstract = boolean : false

mixed = boolean : false

block = (#all| List(extension | restriction))

final = (#all | List(extension | restriction))

>

(annotation?, (simpleContent | complexContent |

((sequence | group | all | choice)?,

((attribute | attributeGroup)*, anyAttribute?))))

</префикс:complexType>

Атрибуты nameиidв элементеcomplexTypeимеют тот же смысл, что и в элементеattribute, а атрибуты abstract, block и final – тот же смысл, что и в элементе element. Атрибут mixed определяет, могут ли символьные данные появляться между дочерними элементами определения комплексного типа.

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

  • элемент simpleContent;

  • элемент complexContent;

  • один из элементов group, all, choice или sequence (0 или 1 раз), один из элементов attribute или attributeGroup (0 и более раз) и элемент anyAttribute (0 или 1 раз).

Рассмотрим дочерние элементы элемента complexType.

4.2.9.2. Элементы sequence, any, choice, all и group

Элемент sequenceопределяет, что дочерние элементы данного элемента должны появляться в заданной последовательности и имеет следующий формат:

<префикс:sequence

id = ID

maxOccurs = (nonNegativeInteger | unbounded) : 1

minOccurs = nonNegativeInteger : 1

>

(annotation?, (element | group | choice | sequence | any)*)

</префикс:sequence>

Необязательный атрибут idзадает уникальный идентификатор элемента, а необязательные атрибутыmaxOccursиminOccursзадают максимальное и минимальное значение для количества включений данной последовательности в родительский элемент.

Пример использования элемента sequence:

<xs:element name="personinfo">

<xs:complexType>

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

<xs:sequence minOccurs="0" maxOccurs="unbounded">

<xs:element name="child" type="xs:string"/>

</xs:sequence>

</xs:sequence>

</xs:complexType>

</xs:element>

В примере задан элемент с именем personinfo(данные о сотруднике). Этот элемент содержит дочерние элементыfirstnameиlastname, а также последовательность элементовchild(ребенок) – эта последовательность может отсутствовать или содержать неограниченное количество элементовchild.

Как видно, из объявления элемента sequence, в содержимом этого элемента может быть задан дочерний элементany. Этот элемент позволяет расширить документXMLэлементами, которые не определены в схеме, и имеет следующий формат:

<префикс:any

id = ID

maxOccurs = (nonNegativeInteger | unbounded) : 1

minOccurs = nonNegativeInteger : 1

namespace = ((##any | ##other) | List (anyURI |

(##targetNamespace | ##local))) : ##any

processContents = (strict | lax | skip) : strict

>

(annotation?)

</префикс:any>

Необязательный атрибут idзадает уникальный идентификатор элемента, а необязательные атрибутыmaxOccursиminOccursзадают максимальное и минимальное значение для количества включений элементаanyв родительский элемент. Необязательный атрибутnamespaceопределяет пространства имен, содержащих элементы, которые могут быть использованы в родительском элементе, и может иметь одно из следующих значений:

  • ##any – допустимы элементы из любого пространства имен;

  • ##other– могут присутствовать элементы из любого пространства имен, отличного от пространства имен, заданного для родительского элемента;

  • ##local– элементы должны задаваться не из пространства имен;

  • ##target Namespace– могут присутствовать элементы из пространства имен, заданного для родительского элемента;

  • List(anyURI| (##targetNamespace |##local))) – могут присутствовать элементы из заданного списка.

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

  • strict– процессорXMLдолжен получить схему необходимых пространств имен и проверить действительность элементов;

  • lax– аналогичноstrict, но если схема не может быть получена, сообщение об ошибке не генерируется;

  • skip– процессорXMLпропускает проверку действительности элементов.

Пример использования элемента any:

<xs:element name="person">

<xs:complexType>

<xs:sequence>

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

<xs:any minOccurs="0"/>

</xs:sequence>

</xs:complexType>

</xs:element>

С помощью использования элемента anyможно расширить содержимое элементаperson(после элементаlastname) любым другим элементом.

Элемент choiceразрешает задавать в родительском элементе только один из присутствующих в списке элементов и имеет следующий формат:

<префикс:choice

id = ID

maxOccurs = (nonNegativeInteger | unbounded) : 1

minOccurs = nonNegativeInteger : 1

>

(annotation?, (element | group | choice | sequence | any)*)

</префикс:choice>

Необязательный атрибут idзадает уникальный идентификатор элемента, а необязательные атрибутыmaxOccursиminOccursзадают максимальное и минимальное значение для количества включений выбранного элемента в родительский элемент.

Пример использования элемента choice:

<xs:element name="employee">

</xs:element>

<xs:element name="freelance">

</xs:element>

<xs:element name="person">

<xs:complexType>

<xs:choice>

<xs:element ref="employee"/>

<xs:element ref="freelance"/>

</xs:choice>

</xs:complexType>

</xs:element>

Элемент personдолжен содержать один из описанных ранее элементов:employee(постоянный сотрудник) илиfreelance (контрактник).

Элемент allопределяет, что элементы, содержащийся в нем, могут появляться в родительском элементе в любом порядке, и каждый элемент может появляться 0 или 1 раз. Элемент имеет следующий формат:

<префикс:all

id = ID

maxOccurs = 1 : 1

minOccurs = (0 | 1) : 1

>

(annotation?, element*)

</префикс:all>

Необязательный атрибут idзадает уникальный идентификатор элемента. Необязательный атрибутmaxOccursдолжен иметь значение 1, а необязательный атрибутminOccursзадает минимальное значение для количества включений выбранного элемента в родительский элемент (0или1).

Пример использования элемента all:

<xs:element name="person">

<xs:complexType>

<xs:all minOccurs="0">

<xs:element name="firstname" type="xs:string"/>

<xs:element name="lastname" type="xs:string"/>

</xs:all>

</xs:complexType>

</xs:element>

Элементы firstnameиlastnameмогут появляться в элементе в элементеpersonв любом порядке и один или оба элемента могут отсутствовать.

Элемент groupиспользуется для задания группы элементов в определении комплексного типа и имеет следующий формат:

<префикс:group

id = ID

name = NCName

ref = QName

maxOccurs = nonNegativeInteger | unbounded : 1

minOccurs = nonNegativeInteger : 1

>

(annotation?, (all | choice | sequence))

</префикс:group>

Атрибут name задает имя элемента. Он является обязательным только в том случае, если родительским элементом данного элемента является элементschemaили элементredefine. Атрибутrefзадает ссылку на имя другой группы (атрибутыnameиrefявляются взаимоисключающими). Необязательные атрибутыmaxOccursиminOccursзадают максимальное и минимальное значение для количества включений элементов группы в родительский элемент.

Пример использования элемента group:

<xs:group name="custGroup">

<xs:sequence>

<xs:element name="customer" type="xs:string"/>

<xs:element name="orderDetails" type="xs:string"/>

</xs:sequence>

</xs:group>

<xs:element name="order" type="orderType"/>

<xs:complexType name="orderType">

<xs:group ref="custGroup"/>

<xs:attribute name="status" type="xs:string"/>

</xs:complexType>

В этом примере определена группа custGroup, состоящая из двух элементов:customer(покупатель) иorderDetails(детали заказа), а затем эта группа использована (с помощью ссылки) в определении комплексного типа orderType.

Соседние файлы в папке Лекции