Определения сложных типов в
схеме заказа на покупку полностью объявляют
последовательности появления элементов в экземпляре документа. Появление отдельных элементов, объявленных в так называемых моделях
содержания типов, может быть не обязательным. На это указывает значение 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
обеспечивает
дополнительную выразительную мощность.