Читать «Java 7 (Наиболее полное руководство)» онлайн - страница 465
Ильдар Шаукатович Хабибуллин
<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. От
него наследуются все сложные типы. Это подобно тому, как у всех классов Java есть общий предок — класс Object, а все массивы наследуются от него. От базового типа anyType наследуется и тип anySimpleType — общий предок всех простых типов.
Таким образом, сложные типы определяются как сужение типа anyType. Если строго подходить к определению сложного типа, то определение типа bookType, сделанное в начале предыдущего раздела, надо записать так:
<xsd:complexType name="bookType">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:sequence maxOccurs="unbounded">
<xsd:element name="author" type="xsd:normalizedString" minOccurs="0" />
<xsd:element name="title" type="xsd:normalizedString" />
<xsd:element name="pages" type="xsd:positiveInteger" minOccurs="0" />
<xsd:element name="publisher" type="xsd:normalizedString" minOccurs="0" />
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
Рекомендация языка XSD позволяет сократить эту запись, что мы и сделали в предыдущем разделе. Это подобно тому, как в Java мы опускаем слова "extends Object" в заголовке описания класса.
Закончим на этом описание языка XSD и перейдем к примерам.
Пример: схема адресной книги
В листинге 28.4 записана схема документа, приведенного в листинге 28.2.
Листинг 28.4. Схема документа XML
<?xml version="1.0"?>
<xsd:schema xmlns:xsd=""
xmlns:ntb="" targetNamespace="">
<xsd:element name="notebook" type="ntb:notebookType" />
<xsd:complexType name="notebookType">
<xsd:element name="person" type="ntb:personType"
minOccurs="0" maxOccurs="unbounded" />
<xsd:complexType name="personType">
<xsd:sequence>
<xsd:element name="name">
<xsd:complexType>
<xsd:attribute name="first" type="xsd:string" use="optional" />
<xsd:attribute name="second" type="xsd:string" use="optional" /> <xsd:attribute name="surname" type="xsd:string" use="required" /> </xsd:complexType>