Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
xml.docx
Скачиваний:
45
Добавлен:
16.04.2015
Размер:
115.97 Кб
Скачать

12. Пространства имён языка xsd. Связь документа xml со своей схемой

Имена элементов и атрибутов, используемые при записи схем, определены в пространстве имен с идентификатором http://www.w3.org/2001/XMLSchema.Префикс имен, относящихся к этому пространству, часто называют xs или xsd, как в листингах 3.1 и 3.2. Каждый анализатор "знает" это пространство имен и "понимает" имена из этого пространства.

Можно сделать это пространство имен пространством по умолчанию, но тогда надо задать пространство имен для определяемых в схеме типов и элементов. Для удобства такого определения введено понятие целевого пространства имен (target namespace). Идентификатор целевого пространства имен определяется атрибутом targetNamespace, например:

<xsd:schema targetNamespace="http://some.firm.com/2003/ntbNames">

После такого определения имена, определяемые в этой схеме, будут отно­ситься к новому пространству имен с идентификатором http://some.fii-m.com /2003/ntbNames.Так сделано в листинге 3.3. Для упрощения записи в нем стандартное пространство имен схемы XML с идентификатором http:// www.w3.org/2001/XMLSchemaсделано пространством имен по умолчанию.Имена, относящиеся к целевому пространству, снабжены префиксом ntb, чтобы они не попали в пространство имен по умолчанию. Поскольку в листинге 3.3 пространством имен по умолчанию сделано про­странство http://www.w3.org/2001/XMLSchema, префикс xsd не нужен.

Следует заметить, что в целевое пространство имен попадают только гло­бальные имена, чьи описания непосредственно вложены в корневой элемент schema. Это естественно, потому что только глобальными именами можно воспользоваться далее в этой или другой схеме. В листинге 3.3 лишь одно глобальное имя notebook. Вложенные имена name, address и др. только ассо­циированы с глобальными именами.

В схемах и документах XML часто применяется еще одно стандартное про­странство имен. Рекомендация языка XSD определяет несколько атрибутов: type, nil, schemaLocation, noNamespaceSchemaLocation, которые Применяются не только в схемах, а и непосредственно в описываемых этими схемами до­кументах XML, называемых экземплярами схем (XML schema instance). Име­на этих атрибутов относятся к пространству имен http://www.w3.org /2001/XMLSchema-instance. Этому пространству имен чаще всего приписы­вают префикс xsl, например:<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

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

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

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

Включаемый файл задается атрибутом xsl: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/yetAnotherNam.es"

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

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

<xsd:import namespace="http://some.firm.com/someNames"xsl:schemaLocation="A.xsd" />

<xsd:import namespace="http://some.firm.com/anotherNam.es"xsl:schemaLocation="B.xsd" />

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

Элементы include и import следует располагать перед всеми определениями схемы.

Значение атрибута xsl:schemaLocation — строка URL, поэтому файл с вклю­чаемой схемой может располагаться в любом месте Интернета.

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

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

$ xsv ntb.xml ntbl.xsd ntb2.xsd

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

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

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

<notebook xmlns:xsl="http://www.w3.org/2001/XMLSchema-instance"xsl:noNamespaceSchemaLocation="ntb.xsd">

В этом случае в схеме не должно быть целевого пространства имен, т. е. не следует ИСПОЛЬЗОВать атрибут targetNamespace.

Если же элементы документа относятся к некоторому пространству имен, то применяется атрибут scnemaLocation, в котором через пробел перечисляются пространство имен и расположение файла со схемой, описывающей это пространство имен. Продолжая пример предыдущего раздела, можно написать: <notebook xmlns="http://some.firm.com/2003/ntbNames"

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

"http: //some.firm.com/someNamesA.xsdhttp://some.firm.com/anotherNamesB.xsd" xmlns:prl="http://some.firm.com/someNames" xmlns:pr2="http://some.firm.com/anotherNames">

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

Другие языки описания схем

Даже из приведенного выше краткого описания язьгка XSD видно, что он получился весьма сложным и запутанным. Есть уже несколько книг, пол­ностью посвященных этому языку. Их объем ничуть не меньше объема всей этой книги.

Есть и другие, более простые языки описания схемы документа XML. Наи­большее распространение получили следующие из них:

Schematron — http://www.ascc.net/xml/resource/schematron/;

RELAX NG — Regular Language Description for XML, New Generation, http://www.oasis-open.org/committees/relax-ng/,этот язык возник как слияние языков Relax и TREX;

Relax — http://www.xml.gr.jp/relax/;

TREX — Tree Regular Expressions for XML, http://www.thaiopensource.com/trex/;

DDML — Document Definition Markup Language, известный еще как XSchema, http://purl.oclc.org/NET/ddml/.

Менее распространены языки DCD (Document Content Description), SOX (One's Schema for Object-Oriented XML), XDR (XML-Data Reduced).

Хороший обзор языков описания схем представлен на странице http://www.oasis-open.org/cover/schemas.html.

Все эти языки позволяют более или менее полно описывать схему докумен­та. Возможно, они вытеснят язык XSD или будут существовать совместно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]