<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/200l/XMLSchema”>
<xsd:element name=”notebook" type="notebookType" />
<xsd:complexType name= " notebookType">
<xsd:element name="perscn" type= "personType"
min0ccurs=”0" maxOccurs="unbounded" />
</xsd:complexType>
<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>
</xsd:element>
<xsd:element name=,”birthday“ type="ruDate" min0ccurs="0“ />
<xsd:element name="address” type="addressType"
min0ccurs="0" maxOccurs="unbounded" />
<xsd: element name= "phone-list" type= "phone-listType" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name= "addressType" >
<xsd:sequence>
<xsd;element name="street" type="xsd:string" />
<xsd: element name="city" type=”cityType" />
<xsd:element name="zip" type="xsd:positiveInteger" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name='cityType' >
<xsd: simpleContent>
<xsd;extension base='xsd:string' >
<xsd:attribute name= 'type' type='placeType’ default='город’ />
|
|
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>
<xsd:simpleType name=”placeType”>
<xsd: restriction base = "xsd:string">
<xsd:enumeration value="город" />
<xsd:enumeration value="пoceлoк,” />
<xsd: enumeration value="«деревня" />
</xsd: restriction>
</xsd: simpleType>
<xsd:complexType name=”phone-listType">
<xsd:element name="work-phone” type=”xsd:string" min0ccurs=”0" maxOccurs=”unbounded" />
<xsd;element name="home-phone" type="xsd:string” min0ccurs=”0" maxOccurs=”unbounded" />
</xsd:complexType>
<xsd:simpleType name="ruDate”>
<xsd:restriction. Base="xsd: string">
<xsd:pattern value=" [0-9] {2}. (0-9) {2}. [0-9] {4}” />
</xsd:restriction
</xsd:simpleType>
</xsd:schema>
Листинг 14.3, как обычный документ XML, начинается с пролога, показывающего версию XML и определяющего стандартное пространство имен схемы XML с идентификатором http://www.w3.org/2001/XMLSchema. Этому идентификатору дан префикс xsd. Конечно, префикс может быть другим, часто пишут префикс xs.
Все описание схемы нашей адресной книжки заключено в одной третьей строке, в которой указано, что адресная книга состоит из одного элемента с именем notebook, имеющего сложный тип notebookType. Этот элемент должен появиться в документе ровно один раз. Остаток листинга 14.3 посвящен описанию типа этого элемента и других типов.
Описание сложного типа notebookType несложно (простите за каламбур). Оно занимает три строки листинга, не считая открывающего и закрывающего тега, и просто говорит о том, что данный тип составляют несколько элементов person типа personType.
Описание типа personType немногим сложнее. Оно говорит, что этот тип составляют четыре элемента name, birthday, address и phone-list. Для элемента name сразу же определены необязательные атрибуты first и second простого типа string, определенного в пространстве имен xsd. Тип обязательного атрибута surname — тоже string.
|
|
Далее в листинге 14.3 определяются оставшиеся типы addressType, phone- listType и ruDate. Необходимость определения простого типа ruDate возникает потому, что встроенный в схему XML тип date предписывает записывать дату в виде 2003-02-22, а в России принят формат 22.02.2003. Тип ruDate определяется как сужение (restriction) типа string с помощью шаблона. Шаблон (pattern) для записи даты в виде ДД.ММ.ГГГГ задается регулярным выражением.