При определении сложного типа можно воспользоваться уже определенным, базовым, сложным типом, расширив его дополнительными элементами, или, наоборот, удалив из него некоторые элементы. Для этого надо применить компонент <complexContent>. В этом компоненте, так же как и в компоненте <simpleContent>, записывается либо компонент <extension>, если надо расширить базовый тип, либо компонент <restriction>, если надо сузить базовый тип. Базовый тип указывается атрибутом base, так же как и при записи компонента <simpleContent>, но теперь это должен быть сложный, а не простой тип!
Расширим, например, определенный выше тип BооkTyрe, добавив год издания — элемент <уеаr>:
<xsd: complexType name="newBookType">
<xsd:complexContent>
<xsd:extension base="bookType">
<xsd:sequence>
<xsd:element name="year" type="xsd:gYear">
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
При сужении базового типа компонентом <restriction> надо перечислить те элементы, которые останутся после сужения. Например, оставим в типе newbookType только автора и название книги из типа BоокТуре:
|
|
<xsd: complexType namc="newBookTypc">
<xsd:complexContent>
<xsd: restriction base=BооkТурс">
<xsa:sequence>
<xsd:element name="author" type=”xsd:normalizcdString" minOccurs=”0" />
<xsd:element name="title" type="xsd:normalizedString” />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
Это описание выглядит странно. Почему надо заново описывать все элементы, остающиеся после сужения? Не проще ли определить новый тип?
Дело в том. что в язык XSD внесены элементы объектно-ориентированного программирования, которых мы не будем касаться. Расширенный и суженный типы связаны со своим базовым типом отношением наследования, и к ним можно применить операцию подстановки. У всех типов языка XSD есть обший предок — базовый тип аnуТуре. От него наследуются все сложные типы. Это подобно тому, как у всех классов Java есть обший предок — класс Object, а все массивы наследуются от него. От базового типа аnуТуре наследуется и тип anySimpleType — обший предок всех простых типов.
Таким образом, сложные типы определяются как сужение типа аnуТуре. Если строго подходить к определению сложного типа, то определение типа BооkTуре, сделанное в начале предыдущего раздела, надо записать так:
<xsd: complexType name="BookType">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence maxOccurs="unbounded">
<xsd: element name="author" type= "xsd:normalizeaString" minQccurs="0" />
<xsd:element name=" title" type= "xsd: normalizedString" />
<xsd”element name= "pages" type=”xsd:positiveInteger” minOccurs="0" />
<xsd:element name="publisher" type="xsd:normalizedString" min0ccurs="0" />
</xsd:sequence>
</xsd:restrictions
</xsd:complexContent>
</xsd: ccmplexType>
Рекомендация языка XSD позволяет сократить эту запись, что мы и сделали в предыдущем разделе.
Закончим на этом описание языка XSD и перейдем к примерам.