Определение типа вложенных элементов

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

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

<xsd:complexType name=”bookType”>

<xsd:sequence maxOccurs="unbounded”>

<xsd:element name="author" type="xsd:normalizedString" minOccurs="0” />

<xsd: element name=”title" typs=nxsd:normalizedString” />

<xsd:element name="pages" type="xsd:positiveInteger” minOccurs="0" />

<xsd:element name=,”publisher*' type="xsd:normalizedString" minQccurs=”0" />

</xsd:sequence>

</xsd:complexType>

Потом описываем элемент:

<xsd: element name="book" type="bookType" />

Элементы <author>, <tit1e>, <pages> и <publisher> должны входить в элемент <book> именно в таком порядке. В документе XML надо писать:

<book>

<author>M. Ильф, Е. Петров</author>

<title>Золотой теленок</title>

<publisher>Детская литература </publisher>

</book>

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

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

<xsd:complexType name="bookType">

<xsd: sequence.maxOccurs="unbounded">

<xsd:element name="author" type="xsd:normalizedString" min0ccurs=”0" />

<xsd:element name="title" type="xsd:normalizedString" />

<xsd:element name="pages" type-"xsd:positiveInteger” min0ccurs="0" />

<xsd:choice>

<xsd:element name="publisher" type= "xsd:normalizedString" minCccurs="0” />

<xsd:element name= "magazine" type="xsd:normalizedString" min0ccurs="0” />

</xsd:choice>

</xsd:sequence>

</xsd:complexType>

Как видно из этого примера, компонент <choice> можно вложить в компонент <sequence>. Можно, наоборот, вложить компонент <sequence> в компонент <choice>. Такие вложения можно проделать сколько угодно раз. Кроме того, каждая группа в этих моделях может появиться сколько угодно раз, то есть, в компоненте <choice> тоже можно записать атрибут maxOccurs="unbounded".

Модель группы <all> отличается в этом от моделей <sequence> и <choice>. В компоненте <а11> не допускается применение компонентов <sequence> и <choice>. Обратно, в компонентах <sequence> и <choice> нельзя применять компонент <а11>. Каждый элемент, входящий в группу модели <аl1>, может появиться не более одного раза, то есть, атрибут maxOccurs этого элемента может равняться только единице.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: