- •Оглавление
- •1. История появления xml и его особенности. Хорошо оформленный документ
- •2. Структура документа xml. Верный документ
- •3. Ссылки на сущности, секция cdata. Комментарии, атрибуты, имена
- •4. Пространства имён xml. Инструкции по обработке
- •5. Конструкции dtd: объявление типа элемента, объявление атрибутов
- •6. Конструкции dtd: объявление сущности, объявление обозначения
- •7. Размещение описания dtd. Программы-анализаторы xml
- •8. Описание схемы документа на языке xsd. Встроенные простые типы
- •9. Определение новых простых типов в xsd
- •10. Объявление элементов и их атрибутов в xsd
- •11. Определение сложных типов в xsd
- •12. Пространства имён языка xsd. Связь документа xml со своей схемой
- •13. Создание ссылок на языке xLink. Пространство имён языка xLink
- •14. Атрибуты, используемые при создании ссылок на языке xLink
- •15. Типы ссылок, создаваемых на языке xLink
- •16. Создание банка ссылок. Программы-обработчики атрибутов xLink
- •17. Таблицы стилей css в языке xml. Язык описания стилей xsl
- •18. Язык записи преобразований xslt бред, не стала разбираться, что из этого надо, а что нет
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 или будут существовать совместно.