2.2 Определения сложных типов, объявления элементов и атрибутов

В XML Schema основное различие между элементами сложных и простых типов заключается в том, что элементы сложного типа могут включать в себя другие элементы и иметь атрибуты, а элементы простого типа не могут. Также важно различие между определениями, которые создают новые типы (как простые, так и сложные) и объявлениями, которые обеспечивают возможность представления элементов и атрибутов со специфическими именами и типами (как простыми, так и сложными) в экземплярах документов .  В данном разделе мы сфокусируем внимание на определении сложных типов и объявлении элементов и атрибутов, представленных в них.

Новые сложные типы определяются посредством использования элемента complexType. Обычно такие определения содержат набор объявлений элементов, ссылок элементов и объявлений атрибутов. Объявления не самостоятельные типы, а скорее ассоциация между именем и ограничениями, которые управляют представлением этого имени в документах, регулируемых связанной с ними схемой. Элементы объявляются посредством использования элемента element, а атрибуты элемента  attribute. Например, USAddress определен как сложный тип, и внутри его определения мы видим пять объявлений элементов и одно объявление атрибута.

Определение типа USAddress

<xsd:complexType name="USAddress" > <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="street" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="state" type="xsd:string"/> <xsd:element name="zip" type="xsd:decimal"/> </xsd:sequence> <xsd:attribute name="country" type="xsd:NMTOKEN" fixed="US"/> </xsd:complexType>

Из этого определения можно сделать вывод о том, что любой элемент, представленный в примере,  чей тип объявлен как USAddress (например, shipTo в po.xml) должен состоять из пяти элементов и одного атрибута.  Эти элементы должны называться name, street, city, state и zip, как задано значениями объявления атрибута name. Элементы обязаны появляться в той же последовательности, в которой они объявлены. Первые четыре элемента будут содержать строковое значение, а пятый числовое.  Элемент, тип которого объявлен как USAddress, может представляться с атрибутом country, который должен содержать строку US.

Определение USAddress содержит только объявления, включающее простые типы: string, decimal и NMTOKEN. Напротив, определение PurchaseOrderType содержит объявления элементов, включающих сложные типы, например, USAddress. Отметим, что оба объявления используют тот же самый атрибут type для определения типа, независимо от того, является тип простым или сложным.

Определение PurchaseOrderType

<xsd:complexType name="PurchaseOrderType"> <xsd:sequence> <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:sequence> <xsd:attribute name="orderDate" type="xsd:date"/> </xsd:complexType>

В определении PurchaseOrderType два объявления элементов (shipTo и billTo ) связывают разные имена элементов с одним и тем же сложным типом, а именно USAddress. Последствие этого определения заключается в том, что любой элемент, представленный в экземпляре документа (например, po.xml), чей тип объявлен как PurchaseOrderType, должен состоять из элементов shipTo и billTo, содержащих пять подэлементов (name, street, city, state и zip), которые объявлены как часть USAddress. Элементы shipTo и billTo могут также включать атрибут country, который объявлен как часть USAddress.

Определение PurchaseOrderType содержит атрибут orderDate. Его объявление подобно объявлению атрибута country использует простой тип. Фактически, все объявления атрибутов должны использовать простые типы, поскольку в отличие от объявлений элементов, атрибуты не могут содержать других элементов или атрибутов.

Объявления элементов, которые мы пока описали, имеют имя, связанное с реальным определением типа. В некоторых случаях более предпочтительно использовать существующий элемент, а не объявлять новый, например: 

<xsd:element ref=”comment” minOccurs=”0”/>

Данное объявление ссылается на существующий элемент comment, который объявлен где-то в другом месте схемы счета на покупку. В общем случае, значение атрибута ref должно ссылаться на глобальный элемент, то есть элемент, который объявлен в schema. Такое объявление предпочтительнее, чем его объявление в определении сложного типа. Это объясняется тем, что элемент с именем comment может неоднократно появляться в экземпляре документа и его содержание должно быть согласовано с типом элемента, в данном случае string.

 

Сайт создан в системе uCoz