Учебное пособие (1075724), страница 18
Текст из файла (страница 18)
Отличие от xsd:key втом, что проверяемые значения могут быть пустыми.В каждый из этих элементов должны быть вложены: xsd:selector–содержитXPath-выражениедляопределенияуникальности. xsd:field – содержит XPath-выражение для задания поля в селекторе.164Ограничение задается на том уровне вложенности, на котором объявляютсяэлементы xsd:key, xsd:keyref, xsd:unique. Поэтому для того, чтобы задатьограничение в рамках всего документа, эти элементы должны быть объявлены вкорневом элементе документа.Пример 3.17.Файл XML:<?xml version="1.0" encoding="utf-8"?><Institute xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="compl_content_key.xsd"><!-- Список курсов --><Courses><Course><CourseId>1</CourseId><CourseName>Интернет-технологии</CourseName></Course><Course><CourseId>2</CourseId><CourseName>Язык XML</CourseName></Course></Courses><!-- Список кафедр --><Departments><Department><DepartmentId>1</DepartmentId><DepartmentName>ИУ-5</DepartmentName></Department><Department><DepartmentId>2</DepartmentId><DepartmentName>ИУ-7</DepartmentName></Department></Departments><!-- Учебный план -->165<PlanElements><PlanElement><!-- Курс --><CourseId>1</CourseId><!-- Кафедра --><DepartmentId>1</DepartmentId><!-- Семестр --><Semestr>3</Semestr></PlanElement><PlanElement><CourseId>1</CourseId><DepartmentId>2</DepartmentId><Semestr>4</Semestr></PlanElement><PlanElement><CourseId>2</CourseId><DepartmentId>1</DepartmentId><Semestr>5</Semestr></PlanElement><PlanElement><CourseId>2</CourseId><DepartmentId>2</DepartmentId><Semestr>5</Semestr></PlanElement></PlanElements></Institute>Файл XSD:<?xml version="1.0" encoding="Windows-1251"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"><!-- Предмет --><xsd:element name="Course"><xsd:complexType><xsd:sequence>166<xsd:element name="CourseId" type="xsd:integer"/><xsd:element name="CourseName" type="xsd:string"/></xsd:sequence></xsd:complexType></xsd:element>Обратите внимание, что в этой схеме все элементы объявлены какглобальные (у элемента xsd:element задан атрибут name).Для ссылки на этот элемент внутри другого элемента используетсяxsd:element с атрибутом ref.<!-- Кафедра --><xsd:element name="Department"><xsd:complexType><xsd:sequence><xsd:element name="DepartmentId" type="xsd:integer"/><xsd:element name="DepartmentName" type="xsd:string"/></xsd:sequence></xsd:complexType></xsd:element><!-- Учебный план --><xsd:element name="PlanElement"><xsd:complexType><xsd:sequence><xsd:element name="CourseId" type="xsd:integer"/><xsd:element name="DepartmentId" type="xsd:integer"/><xsd:element name="Semestr" type="xsd:integer"/></xsd:sequence></xsd:complexType></xsd:element><xsd:element name="Institute"><xsd:complexType><xsd:sequence><xsd:element name="Courses">167<xsd:complexType><xsd:sequence><xsd:element ref="Course" maxOccurs="unbounded"/>Ссылка на элемент Course, который был объявлен ранее.
Обратите вимание,что это ссылка не на тип данных, а ссылка на сам элемент по имени элемента.</xsd:sequence></xsd:complexType></xsd:element><xsd:element name="Departments"><xsd:complexType><xsd:sequence><xsd:element ref="Department" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType></xsd:element><xsd:element name="PlanElements"><xsd:complexType><xsd:sequence><xsd:element ref="PlanElement" maxOccurs="unbounded"/></xsd:sequence></xsd:complexType></xsd:element></xsd:sequence></xsd:complexType><!-- Ключ для предмета --><xsd:key name="KeyCourseId"><xsd:selector xpath=".//Course"/><xsd:field xpath="CourseId"/></xsd:key>Определение первичного ключа с названием KeyCourseId.
В элементе Course,который определяется XPath-выражением (.//Course) вложенный элемент CourseIdдолжен быть уникальным.168<!-- Ключ для кафедры --><xsd:key name="KeyDepartmentId"><xsd:selector xpath=".//Department"/><xsd:field xpath="DepartmentId"/></xsd:key>Первичный ключ для кафедры.<!-- Вторичные ключи для предмета и кафедры --><xsd:keyref name="RefKeyCourseId" refer="KeyCourseId"><xsd:selector xpath=".//PlanElement"/><xsd:field xpath="CourseId"/></xsd:keyref>Определение вторичного ключа с названием RefKeyCourseId. ЭлементCourseId, вложенный в элемент PlanElement, который определяется XPathвыражением (.//PlanElement), должен входить в список значений первичногоключа с названием KeyCourseId. То есть во вторичном ключе не можетвстретиться такое значение CourseId, которого нет в первичном ключе.<xsd:keyref name="RefKeyDepartmentId"refer="KeyDepartmentId"><xsd:selector xpath=".//PlanElement"/><xsd:field xpath="DepartmentId"/></xsd:keyref>Определение вторичного ключа для кафедры.<xsd:unique name="UniquePlanElement"><xsd:selector xpath=".//PlanElement"/><xsd:field xpath="CourseId"/><xsd:field xpath="DepartmentId"/><xsd:field xpath="Semestr"/></xsd:unique>ВэлементеPlanElement,которыйопределяетсяXPath-выражением(.//PlanElement), комбинация вложенных элементов CourseId, DepartmentId и169Semestr должна быть уникальна.
То есть уникальна комбинация курса, кафедры исеместра в учебном плане.</xsd:element></xsd:schema>3.2.13 Использование пространств именXML-схема позволяет проверять действительность документов, содержащихпространства имен.Пример простого документа и схемы с проверкой пространства имен.Пример 3.18.Файл XML:<?xml version="1.0" encoding="Windows-1251"?><q:languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ru/namespace-examplens_example_1.xsd" xmlns:q="http://www.ru/namespace-example">В случае использования пространств имен для подключения схемыиспользуется не атрибут noNamespaceSchemaLocation, а атрибут schemaLocation.Значением атрибута является список из двух значений.
Первое значение –название пространства имен (в нашем примере http://www.ru/namespace-example),второе значение – URI файла схемы (в нашем примере ns_example_1.xsd).Так как в схеме объявлено elementFormDefault="unqualified", то префикспространства имен должен быть указан только у корневого элемента XMLдокумента.Так как в схеме объявлено attributeFormDefault="unqualified", то префикспространства имен у атрибутов не объявляется.Префикс пространства имен в XML-документе « q » не совпадает спрефиксом пространства имен в XML-схеме « ns1 ».
Названия префиксов не170имеютзначения,должнысовпадатьзначенияпространстваимен«http://www.ru/namespace-example».<language id="123"><name>HTML</name><year>01.01.1990</year><howold>15</howold></language></q:languages>Файл XSD:<?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:ns1="http://www.ru/namespace-example"targetNamespace="http://www.ru/namespace-example"elementFormDefault="unqualified"attributeFormDefault="unqualified">Атрибут xmlns:ns1="http://www.ru/namespace-example" содержит объявлениепространстваимен.«ns1»–префикспространстваимен,«http://www.ru/namespace-example» – значение пространства имен.АтрибутtargetNamespace="http://www.ru/namespace-example"определяетпространство имен для проверяемого документа.Атрибуты elementFormDefault = "unqualified" и attributeFormDefault ="unqualified" означают, что не требуется явно указывать префикс пространстваимен для элементов и атрибутов XML-документа.<!-- Определение типа --><xsd:simpleType name="howoldType"><xsd:restriction base="xsd:integer"><xsd:enumeration value='10'/><xsd:enumeration value='15'/><xsd:enumeration value='20'/></xsd:restriction>171</xsd:simpleType><xsd:complexType name="languageType"><xsd:sequence><xsd:element name="name" type="xsd:string"/><xsd:element name="year" type="xsd:string"/><xsd:element name="howold" type="ns1:howoldType"/>При ссылке на типы, объявленные в схеме с пространством имен,необходимоявноссылатьсянапространствоимен,указываяпрефикс(ns1:howoldType).</xsd:sequence><xsd:attribute name="id" use="required" type="xsd:string"/></xsd:complexType><xsd:complexType name="languagesType"><xsd:sequence><xsd:element name="language" type="ns1:languageType"maxOccurs="unbounded"/></xsd:sequence></xsd:complexType><xsd:element name="languages" type="ns1:languagesType"/></xsd:schema>Пример 3.19.Если в XML-схеме (xsd:schema) указано elementFormDefault="qualified", тотребуется явно указывать префикс пространства имен для всех элементов в XMLдокументе.<?xml version="1.0" encoding="Windows-1251"?><q:languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ru/namespace-examplens_example_qe.xsd" xmlns:q="http://www.ru/namespace-example"><q:language id="123"><q:name>HTML</q:name>172<q:year>01.01.1990</q:year><q:howold>15</q:howold></q:language></q:languages>Или префикс может быть совсем не указан, если указано пространство именпо умолчанию.
Тогда вместо атрибута xmlns:q="http://www.ru/namespace-example"необходимо указывать атрибут xmlns="http://www.ru/namespace-example".<?xml version="1.0" encoding="Windows-1251"?><languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ru/namespace-examplens_example_qe.xsd" xmlns="http://www.ru/namespace-example"><language id="123"><name>HTML</name><year>01.01.1990</year><howold>15</howold></language></languages>Пример 3.20.Если в XML-схеме (xsd:schema) указано elementFormDefault="unqualified" иattributeFormDefault="qualified", то не требуется явно указывать префикспространства имен для элементов, но требуется явно указывать префикспространства имен для атрибутов в XML-документе.<?xml version="1.0" encoding="Windows-1251"?><q:languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ru/namespace-examplens_example_qa_1.xsd" xmlns:q="http://www.ru/namespace-example"><language q:id="123"><name>HTML</name><year>01.01.1990</year><howold>15</howold></language></q:languages>173Обратите внимание, что в атрибуте q:id указан префикс пространства имен.ЕсливсхемеобъявленоelementFormDefault="qualified"иattributeFormDefault="qualified", то префикс пространства имен должен бытьуказан у всех элементов и атрибутов.<q:languages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ru/namespace-examplens_example_qa_2.xsd" xmlns:q="http://www.ru/namespace-example"><q:language q:id="123"><q:name>HTML</q:name><q:year>01.01.1990</q:year><q:howold>15</q:howold></q:language></q:languages>Или префикс может быть совсем не указан, если указано пространство именпо умолчанию.














