Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК_XML.doc
Скачиваний:
16
Добавлен:
03.05.2019
Размер:
3.94 Mб
Скачать

9.8. Включение файлов схемы в другую схему

В создаваемую схему можно включить файлы, содержащие другие схемы. Для этого есть два элемента схемы: include и import. Например:

<xsd:include xsi:schemaLocation="names.xsd" />

Включаемый файл задается атрибутом xsi:schemaLocation. В примере он использован для того, чтобы включить в создаваемую схему содержимое файла names.xsd. Файл должен содержать схему с описаниями и определениями из того же пространства имен, что и в создаваемой схеме, или без пространства имен, Т. е. в нём не использован атрибут targetNamespace. Это удобно, если мы хотим добавить к создаваемой схеме определения схемы names.xsd или просто разбить большую схему на два файла. Можно представить себе результат включения так, как будто содержимое файла names.xsd всего лишь записано на месте элемента include.

Перед включением файла можно изменить некоторые определения, приведенные в нем. Для этого используется элемент redefine, например:

<xsd:redefine schemaLocation="names.xsd">

<xsd:simpleType name="nameType">

<xsd:restriction base="xsd:string">

<xsd:maxLength value="40"/>

</xsd:restriction>

</xsd:simpleType>

</xsd:redefine>

Если же включаемый файл содержит имена из другого пространства имен, то надо воспользоваться элементом схемы import. Например, пусть файл A.xsd начинается со следующих определений:

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://some.firm.com/someNames">

а файл B.xsd начинается с определений:

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://some.firm.com/anotherNames">

Чтобы включить эти файлы в новый файл C.xsd, нужно выполнить следующее:

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

targetNamespace="http://some.firm.com/yetAnotherNames"

xmlns:prl="http://some.firm.com/someNames"

xmlns:pr2="http://some.firm.com/anotherNames">

<xsd:import namespace="http://some.firm.com/someNames"

xsi:schemaLocation="A.xsd" />

<xsd:import namespace="http://some.firm.com/anotherNames"

xsi:schemaLocation="B.xsd" />

После этого в файле C.xsd можно использовать имена, определенные в файлах A.xsd и B.xsd, снабжая их префиксами prl и рг2 соответственно. Элементы include и import следует располагать перед всеми определениями схемы. Значение атрибута xsi:schemaLocation — строка URI, поэтому файл с включаемой схемой может располагаться в любом месте Интернета.

9.9. Связь документа xml со своей схемой

Программе-анализатору, проверяющей соответствие документа XML его схеме, надо как-то указать файлы (один или несколько), содержащие схему документа. Это можно сделать разными способами. Во-первых, можно подать эти файлы на вход анализатора. Так делает, например, проверяющий анализатор XSV (XML Schema Validator) (ftp://ftp.cogsci.ed.ac.uk/pub/XSV/):

$ xsv ntb.xml ntbl.xsd ntb2.xsd

Во-вторых, можно задать файлы со схемой как свойство анализатора, устанавливаемое методом setPropertyO, или значение переменной окружения анализатора. Так делает, например, проверяющий'анализатор Xerces.

Эти способы удобны тогда, когда документ в разных случаях нужно связать с различными схемами. Если же схема документа фиксирована, то ее удобнее указать прямо в документе XML. Это делается одним из двух способов:

  • Если элементы документа не принадлежат никакому пространству имен и записаны без префикса, то в корневом элементе документа записывается атрибут noNamespaceSchemaLocation, указывающий расположение файла со схемой в форме URI:

<notebook xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="ntb.xsd">

В этом случае в схеме не должно быть целевого пространства имен, т. е. не следует использовать атрибут targetNamespace.

  • Если же элементы документа относятся к некоторому пространству имен, то применяется атрибут schemaLocation, в котором через пробел перечисляются пространство имен и расположение файла со схемой, описывающей это пространство имен. Продолжая пример предыдущего раздела, можно написать:

<notebook xmlns="http://some.firm.com/2003/ntbNames"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation=

"http://some.firm.com/someNames A.xsd

http://some.firm.com/anotherNames B.xsd"

xmlns:prl="http://some.firm.com/someNames"

xmlns:pr2="http://some.firm.com/anotherNames">

После этого в документе можно использовать имена, определенные в схемах A.xsd и B.xsd, снабжая их префиксами pri и рг2 соответственно.