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

При определении сложного типа можно воспользоваться уже определенным, базовым, сложным типом, расширив его дополнительными элементами, или, наоборот, удалив из него некоторые элементы. Для этого надо применить компонент <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 и перейдем к примерам.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: