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