Определения сложных типов в
схеме заказа на покупку полностью объявляют
последовательности элементов, которые должны появляться в документе
примера. Появление отдельных элементов, объявленных в так называемых моделях
содержания этих типов, может быть не обязательным, что указывается значением 0
в атрибуте minOccurs
(например, для comment
), или другими словами зависит от значений minOccurs
и maxOccurs
. XML Schema также обеспечивает ограничения, которые
применяются к группам элементов, которые появляются в модели содержания. Эти
ограничения соответствуют тем, которые доступны в XML 1.0, а также включают еще ряд
дополнительных ограничений. Отметим, что ограничения не применяются к
атрибутам.
XML Schema обеспечивает возможность определять
группы элементов и задавать им имена. Поэтому эти элементы могут использоваться
при построении моделей содержания сложных типов (как бы копируя принятое в XML 1.0. использование объектных
параметров). Также могут быть определены и неименованные группы элементов.
Наряду с элементами в именованных группах, они принуждают появляться элементы в
том же самом порядке (последовательности), как они объявлены. Альтернативно,
они могут сделать так, что только один из элементов сможет появиться в примере.
Для иллюстрации сказанного, мы
введем две группы в определение PurchaseOrderType для схемы заказа на покупку так, чтобы заказы на покупку могли
содержать либо отдельные адреса поставки и платежа, либо один адрес в случае их
совпадения:
<xsd:complexType name=”PurchaseOrderType”> <xsd:sequence> <xsd:choice> <xsd:group ref=”shipAndBill”/> <xsd:element name=”singleUSAddress” type=”USAddress”/> </xsd:choice> <xsd:element ref=”comment” minOccurs=”0”/> <xsd:element name=”items” type=”Items”/> </xsd:sequence> <xsd:attribute name=”orderDate” type=”xsd:date”/> <</xsd:complexType> <xsd:group name=”shipAndBill”> <xsd:sequence> <xsd:element name=”shipTo” type=”USAddress”/> <<xsd:element name=”billTo” type=”USAddress”/> </xsd:sequence> </xsd:group>
Элемент группы
choice
позволяет только одному из своих
дочерних элементов появляться в примере. Первый дочерний является внутренним
элементом group
, который ссылается на именованную группу
shipAndBill, состоящую из
последовательности элементов shipTo, billTo, а
второй дочерний является singleUSAddress. Следовательно, в документе примера,
элемент purchaseOrder должен содержать
либо элемент shipTo за которым следует элемент billTo,
либо элемент singleUSAddress. Группа choice
и следующие за ней объявления
элементов comment
и items
являются
дочерними группы sequence
. Эффект этих различных групп заключается
в том, что в указанном порядку за элементами адреса должны следовать элементы
comment
и items
.
Существует и третья возможность
для определения элементов в группе. Все элементы в группе могут появиться один
раз или не разу, а также в любой последовательности. Группа all
(которая обеспечивает упрощенную версию
SGML &-Connector), ограничена на верхнем уровне любой моделью содержания.
Кроме того, дочерние элементы группы должны быть все индивидуальными элементами
(не группами), и никакой элемент в модели содержания не может появиться более
чем один раз, то есть допустимыми значениями minOccurs
и maxOccurs
являются 0 и 1. Например, для того чтобы позволить дочерним
элементам purchaseOrder появляться в любой последовательности, мы
должны переопределить PurchaseOrderType как:
<xsd:complexType name=”PurchaseOrderType”> <xsd:all> <xsd:element name=”shipTo” type=”USAddress”/> <xsd:element name=”billTo” type=”USAddress”/> <xsd:element ref=”comment” minOccurs=”0”/> <xsd:element name=”items” type=”Items”/> </xsd:all> <xsd:attribute name=”orderDate” type=”xsd:date”/> </xsd:complexType>
Исходя из этого определения,
элемент comment
может
произвольно появляться в пределах purchaseOrder, и он может появиться до или после
любого из элементов shipTo, billTo и items
, но только однажды. Кроме того,
соглашения группы all
не позволяют нам объявлять такой элемент
как comment
вне группы, что подразумевает возможность
его появления более чем один раз. XML Schema предусматривает, что группа all
должна появляться как единственный дочерний на
верхнем уровне модели содержания. Другими словами, следующее неверно:
<xsd:complexType name=”PurchaseOrderType”> <xsd:sequence> <xsd:all> <xsd:element name=”shipTo” type=”USAddress”/> <xsd:element name=”billTo” type=”USAddress”/> <xsd:element name=”items” type=”Items”/> </xsd:all> <xsd:sequence> <xsd:element ref=”comment” minOccurs=”0” maxOccurs=”unbounded”/> </xsd:sequence> </xsd:sequence> <xsd:attribute name=”orderDate” type=”xsd:date”/> </xsd:complexType>
Наконец,
именованные и неименованные группы, которые появляются в моделях содержания (group,
choice
, sequence
, all
соответственно)
могут включать атрибуты minOccurs
и maxOccurs
. Комбинируя и вкладывая различные
группы, поддерживаемые XML Schema, и устанавливая значения minOccurs
и maxOccurs
, возможно представить любую модель
содержания, которую можно выразить с
помощью XML 1.0 DTD. Кроме
того, группа all
обеспечивает
дополнительную выразительную мощность.