В XML Schema основное различие между элементами сложных
и простых типов заключается в том, что элементы сложного типа могут включать в
себя другие элементы и иметь атрибуты, а элементы простого типа не могут. Также
важно различие между определениями, которые создают новые типы (как простые,
так и сложные) и объявлениями, которые обеспечивают возможность представления элементов и атрибутов со специфическими
именами и типами (как простыми, так и сложными) в экземплярах
документов . В данном разделе мы
сфокусируем внимание на определении сложных типов и объявлении элементов и
атрибутов, представленных в них.
Новые сложные типы
определяются посредством использования элемента complexType.
Обычно такие определения содержат
набор объявлений элементов, ссылок элементов и объявлений атрибутов. Объявления
не самостоятельные типы, а скорее ассоциация между именем и ограничениями, которые
управляют представлением этого имени в документах, регулируемых связанной с ними схемой.
Элементы объявляются посредством использования элемента element
, а атрибуты элемента attribute
. Например, 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
для определения типа, независимо от
того, является тип простым или сложным.
<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
.