Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 464

Ильдар Шаукатович Хабибуллин

</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" minOccurs="0" />

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

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

<xsd:choice>

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

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

</xsd:choice>

</xsd:sequence>

</xsd:complexType>

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

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

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

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

Расширим, например, определенный ранее тип bookType, добавив год издания — элемент <year>:

<xsd:complexType name="newBookType">

<xsd:complexContent>

<xsd:extension base="bookType">

<xsd:sequence>

<xsd:element name="year" type="xsd:gYear">

</xsd:sequence>

</xsd:extension>

</xsd:complexContent>

</xsd:complexType>

При сужении базового типа компонентом <restriction> надо перечислить те элементы, которые останутся после сужения. Например, оставим в типе newbookType только автора и название книги из типа bookType: