logo
Хабибуллин

Определение типа со сложным телом

При определении сложного типа можно воспользоваться уже определенным, базовым, сложным типом, расширив его дополнительными элементами или, наоборот, удалив из него некоторые элементы. Для этого надо применить компонент <complexContent>. В этом компоненте, так же как и в компоненте <simpleContent>, записывается либо компонент <extension>, если нужно расширить базовый тип, либо компонент <restriction>, если необходимо сузить базовый тип. Базовый тип указывается атрибутом base, так же как и при записи компонента <simpleContent>, но теперь это должен быть сложный, а не простой тип!

Расширим, например, определенный ранее тип bookType, добавив год издания — эле-

мент <year>:

<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 только автора и название книги из типа bookType:

<xsd:complexType name="newBookType">

<xsd:complexContent>

<xsd:restriction base="bookType"> <xsd:sequence>

<xsd:element name="author" type="xsd:normalizedString" minOccurs="0" />

<xsd:element name="title" type="xsd:normalizedString" /> </xsd:sequence>

</xsd:restriction>

</xsd:complexContent>

</xsd:complexType>

Это описание выглядит странно. Почему надо заново описывать все элементы, остающиеся после сужения? Не проще ли определить новый тип?

Дело в том, что в язык XSD внесены элементы объектно-ориентированного программирования, которых мы не будем касаться. Расширенный и суженный типы связаны со своим базовым типом отношением наследования, и к ним можно применить операцию подстановки. У всех типов языка XSD есть общий предок — базовый тип anyType. От