Если значениями определяемого сложного типа будут элементы, содержащие вложенные элементы, как, например, элементы <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 этого элемента может равняться только единице.