2.7 Построение моделей содержания

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

Группа ‘All’

<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  должна появляться как единственный дочерний на верхнем уровне модели содержания. Другими словами, следующее неверно:

Ошибочный пример с группой '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  обеспечивает дополнительную выразительную мощность.

 

Используются технологии uCoz