Языки информационного обмена

Связи и запросы

Разбить на страницы
Показывать лекцию целиком

Для того чтобы язык XML мог полностью задействовать свой потенциал, необходимо иметь способ реализации ссылок между документами XML, указатели на них и запросы к ним.

В связи с тем, что в документах XML сохраняется все 6ольше информации, возникает необходимость в разработке способа получения структурированного доступа к этой информации. Также необходимы способ определения связей между частями документов и обращения к фрагментам (или ресурсам) внутри документов, которые связаны с другими ресурсами. Эти ресурсы могут быть фрагментами как того же, так и других документов, или вовсе не относиться к формату XML.

XML Information Set

Проект The XML Information Set, или Infoset, - рабочий проект W3C описания различных фрагментов информации, составляющих правильно оформленный документ XML.

Целью проекта является создание общего словаря для описания содержания документов XML. Любой процессор XML, возвращающий информацию о содержании документа XML, будет описывать содержание в терминах данных информационных пунктов.

Информационные пункты

Имеющиеся пятнадцать различных пунктов информации совместно составляют правильно оформленный документ XML. Некоторые из этих пунктов должны присутствовать в грамматически разобранном (проанализированном) представлении документа XML, чтобы он мог быть конгруэнтным (по стандартам W3C ) оригинальному документу, другие можно при желании опустить. Назовем типы информации (информационных пунктов):

  • Один информационный пункт документа (обязателен)
  • Один или больше информационных пунктов элементов (обязательно)
  • Информационные пункты атрибутов (обязательны)
  • Информационные пункты команд обработки (обязательны)
  • Информационные пункты символов (обязательны)
  • Ссылка на пропущенные информационные пункты сущностей (обязательны)
  • Информационные пункты комментариев (необязательны)
  • Информационный пункт декларации пункта документа (необязательны)
  • Информационные пункты объектов (обязательны для не анализируемых сущностей, необязательны для анализируемых сущностей)
  • Информационные пункты нотации (обязательны)
  • Информационные пункты маркера начала сущности (необязательны)
  • Информационные пункты маркера конца сущности (необязательны)
  • Информационные пункты маркера начала раздела CDATA (необязательны)
  • Информационные пункты маркера конца раздела CDATA (необязательны)
  • Информационные пункты декларации пространства имен (обязательны)
  • Необязательные пункты являются необязательными в том смысле, что они требуются в грамматически разобранном представлении документа для того, чтобы оно было достаточно конгруэнтно оригиналу в соответствии с определением InfoSet консорциума W3C.

    Документ

    Информационный пункт документа должен быть всегда ровно один, он содержит информацию о документе в целом и имеет следующие свойства:

  • Список порожденных информационных пунктов в порядке их следования в оригинальном документе. Сюда входит, по крайней мере, один информационный пункт элемента. Кроме того, список должен содержать все информационные пункты команд обработки, определенные вне контекста корневого элемента документа. По желанию разработчика в этот список могут входить также информационные пункты комментариев, находящихся вне корневого элемента документа, а также информационные пункты декларации типа документа (если в оригинальном документе такая информация определена).
  • Неупорядоченный набор из информационных пунктов нотаций для всех нотаций документа.
  • Неупорядоченный набор из информационных пунктов сущностей для всех не анализируемых сущностей документа. По желанию разработчика в этот список могут входить также информационные пункты для анализируемых сущностей, для сущности документа и для внешнего множества DTD.
  • При желании разработчик может включить сюда также идентификатор URI обрабатываемого документа.
  • Элемент

    Для каждого элемента документа XML должен существовать один информационный пункт.

    Информационные пункты элемента имеют следующие свойства:

  • Упорядоченный список информационных пунктов порожденных элементов, команд обработки, ссылок на пропущенные сущности и символов в порядке их следования в документе. Этот список может быть пустым. При желании разработчика в него можно включить также информационные пункты комментариев. Кроме того, в список могут входить также информационные пункты маркеров: начала сущности, конца сущности, начала данных типа CDATA и конца данных типа CDATA ; эти пункты могут входить только соответствующими парами (не должно быть маркера начала без маркера конца и наоборот).
  • Не упорядоченный список информационных пунктов атрибутов, по одному для каждого атрибута элемента. В набор входят также и атрибуты по умолчанию. Обратите внимание: если у элемента имеется атрибут пространства имен, а анализатор не распознает пространства имен, то атрибут включен в этот список для спецификации пространства имен; в противном случае он не будет туда включен. Этот список может быть пустым.
  • Содержащийся в имени элемента фрагмент, соответствующий универсальному идентификатору ресурса ( URI ), предоставляемый процессором пространства имен. Если анализатор не осуществляет обработки пространств имен или если пространство имен для элемента не определено, URI будет равен нулю.
  • Локальная часть имени элемента. Если анализатор не обрабатывает пространства имен, эта часть содержит все имя целиком (включая название пространства имен и двоеточие при наличии идентификатора пространства имен в имени элемента). В противном случае она представляет собой только локальную часть имени (после двоеточия) или имя целиком (если пространство имен не указано).
  • Неупорядоченный набор ссылок на информационные пункты деклараций пространства имен. Они соответствуют пространствам имен, объявленным в составе этого элемента.
  • По желанию разработчика сюда может входить также неупорядоченный список информационных пунктов деклараций пространств имен, которые соответствуют пространствам имен, объявленным в области действия этого элемента (т.е. в самом элементе или в одном из его предков).
  • Атрибут

    У каждого атрибута документа должен быть один информационный пункт. Если процессор распознает пространства имен, то используемые для их определения атрибуты в списке данных информационных пунктов представлены не будут.

    У информационных пунктов атрибутов имеются следующие свойства:

  • Фрагмент URI имени атрибута, при наличии.
  • Локальная часть имени атрибута.
  • Упорядоченный список информационных пунктов символов для каждого символа в (нормализованном) значении атрибута. При желании в этот список можно также включить информационные пункты маркеров начала и конца сущностей для всех ссылок на объекты в значении атрибута.
  • По желанию разработчика можно указать флаг, определяющий, значение этого атрибута определено либо задано по умолчанию в определении DTD или в схеме.
  • По желанию разработчика можно указать значение атрибута по умолчанию из DTD.
  • По желанию разработчика можно указать тип, объявленный для атрибута в определении DTD.
  • Команды обработки

    Для каждой команды обработки документа должен существовать информационный пункт команды обработки. Декларация ХМL и декларации внешних анализируемых объектов сами по себе командами обработки не считаются.

    Информационные пункты команд обработки содержат следующие свойства:

  • Цель команды обработки. Это первый знак, следующий за символами "<?" в теге команды обработки.
  • Содержание команды обработки. Это остальной текст в теге перед закрывающими символами "?>", из которого удалено предшествующее ему пустое пространство. Может представлять собой, пустую строку.
  • Разработчик может указать также идентификатор URI объекта, первоначально содержавшего команду обработки (если команда обработки объявлена в тексте, это будет URI обрабатываемого документа, если он известен).
  • Ссылка на пропущенную сущность

    Информационный пункт ссылки на пропущенную сущность должен быть определен для каждой ссылки на сущность, которая либо не была интерпретирована анализатором, не осуществляющим проверку на допустимость, либо в связи с тем, что декларация неизвестной сущности не была прочитана (например, вследствие недоступности), либо потому, что анализатор не включает внешние анализируемые сущности.

    У информационных пунктов ссылок на неизвестные сущности имеются следующие свойства:

  • Имя сущности, на которую ссылаются.
  • По желанию разработчика можно включить также информационный пункт ссылки на сущность для неразвернутой внешней анализируемой сущности, если анализатор прочитал декларацию.
  • Символ

    Для каждого символа документа, не являющегося символом разметки, должен быть информационный пункт символа (обратите внимание - один информационный пункт для каждого отдельного символа). На практике расположенные рядом символы объединяют в строки или конструкции текста, а не перечисляют по отдельности (в соответствии со спецификацией W3C Infoset, это допустимо).

    Информационные пункты символов содержат свойства:

  • Код символа в соответствии со стандартом ISO 10646 (Unicode).
  • Флаг, показывающий, является ли символ пустым пространством внутри содержания или нет. Проверяющие на допустимость анализаторы должны всегда устанавливать этот флаг; не проверяющие на допустимость при желании могут установить этот флаг равным false.
  • При желании разработчик может указать, был ли этот символ включен как часть предопределенной сущности XML.
  • Комментарий

    Для каждого комментария в документе можно определить один информационный пункт комментария.

    Информационный пункт комментария содержит свойство - содержание этого комментария.

    Декларация типа документа

    Один информационный пункт декларации типа документа можно указать при желании разработчика и при наличии такой декларации.

    У информационного пункта декларации типа документа могут быть следующие свойства:

  • Ссылка на информационный пункт сущности для внешнего подмножества DTD.
  • Упорядоченный список ссылок на информационные пункты комментариев и команд обработки, присутствующие в DTD.
  • Сущность

    Не анализируемые внешние сущности должны быть представлены в виде информационных пунктов сущностей. Для каждой другой сущности в документе также может существовать информационный пункт объекта. Если сущность была объявлена несколько раз, для создания информационного пункта сущности используется только первая ее декларация.

    Информационные пункты сущностей содержат такие свойства:

  • Тип сущности (внутренняя параметрическая сущность, внешняя параметрическая сущность, внутренняя общая сущность, внешняя общая сущность, не анализируемая сущность, сущность документа или внешнее подмножество DTD ).
  • Имя сущности. Равно неопределенному значению (null), если информационный пункт сущности представляет собой сущность документа или внешнее определение DTD.
  • Системный идентификатор сущности. Для внутренних сущностей это свойство равно null; для сущности документа оно может быть равно null, а может содержать системный идентификатор документа.
  • Общий идентификатор сущности, если он есть. Для внутренних сущностей равен null.
  • Если сущность является не анализируемой, то ссылка - на информационный пункт нотации. Для других типов сущностей равен null.
  • Базовый идентификатор URI сущности. Если сущность является внутренней, то значение этого идентификатора должно быть равно null
  • По желанию разработчика можно включить текст сущности, если это внутренняя сущность.
  • По желанию разработчика можно включить также название кодировки символов, в которой выражена сущность.
  • Можно включить также указание на статус автономности сущности. Допустимы значения "yes", "no" и "not present".
  • Нотация

    Для каждой объявленной в определении DTD нотации должен быть один информационный пункт нотации.

    Информационные пункты нотации содержат следующие свойства:

  • Имя нотации
  • Системный идентификатор нотации, или null, если он не был определен
  • Общий идентификатор нотации, или null, если он не был определен
  • Базовый идентификатор URI, соответствующий нотации
  • Маркер начала сущности

    Для того чтобы отметить начало текста, вставляемого из внешней анализируемой сущности, имеется маркер начала сущности. Маркер не используется для параметрических сущностей.

    Информационный пункт маркера начала сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.

    Маркер конца объекта

    Для того чтобы отметить конец текста, вставляемого из внешней анализируемой сущности, существует маркер конца сущности. Маркер не используется для параметрических сущностей.

    Информационный пункт маркера конца сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.

    Маркер начала раздела CDATA

    Для того чтобы показать начало текста, включенного в раздел DATA, используется один маркер начала объекта. Информационный пункт маркера начала раздела CDATA не имеет свойств.

    Маркер конца раздела CDATA

    Для того чтобы показать конец текста, включенного в раздел CDATA, используется один маркер конца сущности. Информационный пункт маркера конца раздела CDATA не имеет свойств.

    Декларация пространства имен

    Для каждого пространства имен существует одна декларация пространства имен, она объявляется (или подразумевается) как атрибут элемента.

    Информационный пункт декларации пространства имен имеет следующие свойства:

  • Объявляемое пространство имен. Это фрагмент имени атрибута, следующий за префиксом xmlns:.
  • Абсолютный идентификатор URI объявляемого пространства имен. Необходимо сообщить либо это свойство, либо следующее далее свойство потомка (описывающее текст), либо то и другое.
  • Упорядоченный список символьных ссылок на информационные пункты символов, которые составляют содержание значения атрибута. В него могут входить также маркеры начала и конца сущности, показывающие расположение ссылок на сущности. Должно присутствовать либо это, либо предыдущее свойство. Консорциум W3C добавил это свойство, чтобы обеспечить возможность определять пространства имен в будущих версиях не по URI.
  • Важность проекта Information Set

    Все эти информационные пункты и свойства практически идентичны модели DOM. Фактически все различные технологии, определенные консорциумом W3C для доступа к документам XML - XML DOM, XLink, XPath, XPointer, а также XSLT - являются производными от базовой структуры, описанной в спецификации XML Information Set. Чтобы извлечь максимум из предоставляемых этими технологиями функциональных возможностей, необходимо рассматривать документы XML не как потоки текстовой информации, а именно как описанные ранее объекты.

    Несмотря на то, что стандарт подробно описывает соединения между объектами, он не определяет какой-либо конкретной реализации.

    Чтобы использовать различные технологии, определенные консорциумом W3C для доступа к документам XML и манипулирования ими, сначала необходимо изучить определения консорциума W3C в спецификации Infoset. Как только вы перестанете считать документы XML текстом и начнете думать о них как о связанных информационных пунктах, вы обнаружите, что механизмы связывания и запросов для доступа к документам XML становятся очень естественными и интуитивными. В этих технологиях используются пункты информационного набора, описанные в стандарте Infoset ; они позволяют манипулировать документами XML и адресовать их, используя представленные в пунктах связи типа "родитель-потомок" для навигации по этим документам.

    Создание ссылок на языке XLink

    Язык XLink позволяет создать ссылку в одном, а использовать в других документах. Ссылка может указывать сразу на несколько документов. Сослаться можно не только на документ XML, но и на любой информационный ресурс: изображение, чертеж, программу. Можно организовать ссылку, связывающую другие документы, например, ссылка, записанная в документе docl.xml, может установить связь между документом doc2.xml и документом doc3.xml. Кроме того, язык XLink отмечает направление ссылки и позволяет организовать обратные ссылки. Эти возможности делают язык XLink чрезвычайно мощным, способным удовлетворить нужды самого привередливого разработчика.

    Пространство имен языка XLink

    Интересная особенность языка XLink заключается в том, что он не вводит новые элементы, а определяет только атрибуты, которые можно использовать в любых определяемых вами элементах. Каждый элемент в документе XML, использующий атрибуты языка XLink, становится ссылкой. Атрибуты введенные языком XLink, находятся в пространстве имен http://www.w3.org/1999/xlink. Как обычно, перед использованием атрибутов надо связать это пространство имен с каким-либо префиксом. Очень часто этот префикс называется xlink

    <someElement xmlns:xlink="http://www.w3.org/1999/xlink>
    someText"
    </someElement>

    Всего в языке XLink объявлено десять атрибутов:

  • атрибут type задает тип ссылки;
  • атрибут href описывает адрес ресурса, с которым связана ссылка;
  • атрибут show определяет способ показа полученного по ссылке ресурса;
  • атрибут actuate устанавливает момент активизации ссылки;
  • атрибуты label, from, to отмечают и указывают начальные и конечные пункты ссылки;
  • атрибуты role, arcrole, title объясняют смысл ссылки.
  • Разумеется, кроме атрибутов языка XLink в объявляемых элементах-ссылках можно объявлять и любые другие атрибуты.

    Создание банка ссылок

    При создании какого-либо документа на языке HTML, назовем его для определенности doc.html, в него вставляются гиперссылки на предыдущие, ранее созданные, документы и изображения. Пусть эти ресурсы лежат в файлах oldl.html, old2.html, imgl.gif. Через некоторое время появляются новые документы, назовем их newl.html, new2.html, на которые необходимо сослаться из документа doc.html. Для этого придется отыскать файл doc.html и внести в него новые ссылки. Это очень неудобно. Не говоря уже о том, что файл doc.html может быть недоступен, его уже могли скопировать на множество сайтов. Придется вносить изменения во все копии, что совершенно невозможно.

    Язык XLink, в котором можно сделать ссылки и в прямом, и в обратном направлении, позволяет создать обратные ссылки из новых документов на старый документ. Но это не лучший выход из положения, потому что старый документ при каждом открытии должен отыскать и просмотреть новые документы в поисках этих ссылок. Это требует времени и знания тех адресов, где лежат эти новые документы.

    К счастью, язык XLink предлагает другой, более удобный выход из этой ситуации. Мы выносим все ссылки в отдельный файл - "банк ссылок" - и в случае необходимости изменяем ссылки только в этом файле. Все документы, которым нужны ссылки, обращаются за ними в банк ссылок.

    Уточненные ссылки XPointer

    Язык XLink позволяет организовать только внешние ссылки на информационный ресурс. Они не могут сослаться на определенное место удаленного документа или на какое-то произвольное место того документа, в котором они записаны. Такие ссылки могут быть полезны, поскольку очень часто в документах нужно организовать ссылку на определенное место того же самого документа, скажем, при создании оглавления, предметного указателя, глоссария.

    В языке HTML <а>. В нем атрибутом href указывается метка того места документа, на которое мы хотим перейти. Перед меткой ставится символ "решетка" #.

    Например:
    <a href="#ref0012"> Пункт оглавления </a>

    В том месте документа, на которое мы хотим перейти, записывается тег <а> с атрибутом name и той же меткой:

    <a name="ref0012"></a>

    Подобную метку можно записать в удаленном документе, допустим, в файле remfile.html, и ссылаться на нее следующим образом:

    <a href="http://some.com/pub/remfile.html#ref0012"> Пункт оглавления </а>

    Браузер загрузит документ remfile.html и покажет ту его часть, в которой записан элемент.

    <a name="ref0012"></a>

    Аналогичная конструкция, разумеется, есть и в XML. По правилам XML метки создаются с помощью атрибутов типа ID, которые можно объявить в любом элементе.

    Ссылки на помеченные элементы указываются атрибутами типа IDREF или IDREFS, которые тоже можно объявить в любом элементе. Проверяющий анализатор, просматривая документ XML, следит за соответствием меток и ссылок на них, отмечая как ошибку ссылку на несуществующую метку. Знак решетки # в ссылках записывать не нужно, сам тип IDREF показывает, что значение атрибута - ссылка.

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

    <item ref="ref0012"> ????? ?????????? </item>
    ? ???????? ??????? ????? ???:
    <ch id="ref0012" />
    ?????????? ????????? item ? ch ?? ????? XSD ????? ????? ???:
    <xsd:element name="item"> 
    <xsd:complexType> 
    <xsd:simpleContent>
    <xsd:extension base="xsd:string">
    <xsd:attribute name="ref" type="xsd:IDREF"/>
    </xsd:extension>
    </xsd:simpleContent>
    </xsd:complexType> 
    </xsd:element>
    <xsd: element name=="ch">
    <xsd:attribute name="id" type="xsd:ID" use="required" /> 
    </xsd:element>

    Эта простая конструкция языка XML очень скоро перестала удовлетворять разработчиков документов XML. Им потребовалось ссылаться:

  • на определенную точку - букву, символ, позицию - внутри элемента;
  • на множество точек, выбранных по образцу, скажем, на каждое появление в тексте слова "монитор";
  • не на определенный элемент или точку внутри элемента, а на какую-то часть документа, границы которой не совпадают с началом и концом элемента;
  • на что-нибудь вроде "третьего абзаца пятого параграфа предыдущей версии документа".
  • Кроме того, не всегда возможно расставлять в элементах атрибуты типа ID. В конце концов, документ не всегда доступен, или у разработчика просто может отсутствовать право записи в документ, на который надо сослаться.

    Следуя духу XML, консорциум W3C создал для записи таких уточненных ссылок и меток язык XPointer. Общую структуру языка описывает рекомендация "XPointer Framework".

    XPointer не является реализацией XML. Он не определяет никакие типы данных и не объявляет элементы и атрибуты. Он задает только правила записи меток и обращения к ним с помощью ссылок языка XLink.

    На языке XPointer метки называются указателями. XPointer определяет два вида указателей: простые указатели и указатели, основанные на схеме. Рассмотрим подробнее каждый из этих видов.

    Простые указатели

    Простой указатель представляет собой имя типа NCName языка XSD, состоящее из букв, цифр, точек, дефисов и знаков подчеркивания. Имя должно начинаться с буквы. Как обычно в XML, указатель вписывается в любом атрибуте-идентификаторе типа ID, который может содержаться в любом элементе документа XML. Например:

    <someElem myid="label02">
    Содержимое элемента 
    </someElem>

    Атрибут-указатель в примере myid обязательно должен быть объявлен при описании схемы документа. Объявить его следует с типом ID.

    Использование простых указателей в ссылках

    Ссылки на информационный ресурс, содержащий указатели, записываются по правилам языка XLink, в который добавлена конструкция, взятая из языка HTML, а именно в ссылке на ресурс перед указателем ставится знак решетки #:

    <myLink xlink:type="simple"
    xlink:href="mydoc.xml#label02" />

    Ссылка, записанная в том же самом документе mydoc.xml, начинается с решетки и выглядит так:

    <myLink xlink:type="simple"
    xlink:href="#label02" />

    Если в документе записано несколько одинаковых указателей label02, то ссылка будет связана с первым из них.

    Как видите, простые указатели языка XPointer только дублируют конструкции, давно применяемые в HTML и XML. Все новые возможности языка реализованы через указатели, основанные на схеме.

    Указатели, основанные на схеме

    Указатели, основанные на схеме, состоят, как и следует из их названия, из одной или нескольких схем, записанных через пробелы. Вот пример:

    xpointer(/book/chapter/section)  element (color/3)

    В этом примере указатель состоит из двух схем. Первая схема задает ссылку на элемент section, вложенный в элемент chapter, который, в свою очередь, вложен в концевой элемент book.

    Вторая схема ссылается на третий по счету элемент из всех непосредственно вложенных в помеченный простым указателем color элемент.

    Использование указателей в ссылках

    Указатели, основанные на схеме, используются точно так же, как и простые указатели. Они записываются в атрибутах элементов-ссылок после пути к файлу и отделяются от него "решеткой":

    <myLink xlink:type="simple"
    	xlink:href="mydoc.xml#element(color/3) "/>

    Понятие схемы в языке XPointer

    Слово "схема" в языке XPointer получило новое значение. Это запись вида

    element (color/3)

    похожая на запись функции и состоящая из имени схемы и данных, записанных в скобках.

    Схемы, записанные в указателе, просматриваются последовательно до тех пор, пока не будет найдена точка в документе, отвечающая какой-либо схеме. После этого просмотр указателя прекращается, оставшиеся схемы не рассматриваются. В приведенном выше примере, если будет найден элемент section, то схема element (color/3) рассматриваться уже не будет.

    Имя схемы - это уточненное имя типа Qname, состоящее из необязательного префикса, связанного с идентификатором пространства имен, и локальной части, отделенной от префикса двоеточием.

    Имена без префиксов зарезервированы за схемами, которые определяются в рекомендациях консорциума W3C. Каждая схема, предложенная консорциумом, описывается отдельной рекомендацией. Разработчики могут вводить свои схемы, снабжая их имена префиксами.

    Смысл и правила записи данных зависят от вида схемы. Есть только одно общее правило, вытекающее из того, что данные записываются в скобках - все скобки, относящиеся к данным, должны быть парными или предваряться символом "каре" ("крышечкой"): xxx^(yyy или yyy^)xxx. Если же в данных встречается символ каре, то его следует удваивать: xxx^^yyy.

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

    Схема element()

    Схема element() реализует потребность ссылаться на элемент документа XML примерно в таком стиле: "сослаться на второй абзац третьего параграфа договора №5". Реализация очень проста и выглядит следующим образом:

    element(/1/3/2)

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

    Запись вида /1/3/2 называется последовательностью вложений. Она напоминает запись пути к файлу. Наклонная черта отмечает вложенный элемент подобно вложенному каталогу файловой системы, но вместо имени вложенного каталога или файла стоит натуральное число. Число, записанное за наклонной чертой, показывает порядковый номер непосредственно вложенного элемента. Отсчет элементов начинается с 1.

    Поскольку в хорошо оформленном документе XML может быть только один корневой элемент, последовательность вложений обычно начинается с наклонной черты и единицы: /l. За следующей наклонной чертой перечисляются элементы, непосредственно вложенные в корневой элемент и т. д.

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

    element (sect3a/2)

    Наконец, данные в схеме element () могут состоять только из простого указателя:

    element (sect3a)

    Это эквивалентно написанию простого указателя без всякой схемы.

    Схема xpointer()

    Схема xpointer() использует для создания указателей и ссылок на них мощные средства адресации элементов и других частей документа, предоставляемые языком XPath. В схеме xpointer() данными, записываемыми в скобках, могут служить любые выражения, допускаемые в языке XPath, а также их расширения, введенные в язык XPointer.

    Дерево документа

    Язык XPath рассматривает документ XML как дерево. Корнем дерева будет корневой элемент документа, а узлами - вложенные элементы, содержимое элемента (текстовый узел) или его атрибуты. Кроме того, в узлах дерева могут находиться комментарии, инструкции по обработке, пространства имен.

    Схема element() не учитывает текстовые узлы и узлы-атрибуты. Она отмечает только вложенные элементы. Но схема xpointer() должна строго следовать правилам языка XPath и учитывать текстовые узлы, даже если они содержат только пробельные символы. Впрочем, многие программы-анализаторы языка XPointer не следуют этому правилу. Например, функция last() разными программами-анализаторами будет вычислена по-разному в зависимости от того, как они построят дерево документа.

    Дополнения языка XPointer

    Исторически сложилось так, что язык XPath был создан на два года раньше языка XPoinler. Поэтому создатели языка XPointer внесли в него дополнения, расширившие конструкции языка XPath.

    Во-первых, кроме узлов дерева, язык XPointer рассматривает точки (points) и области (ranges).

    Точкой язык XPointer называет позицию между символами документа XML.

    Область занимает пространство между двумя точками: начальной точкой и конечной точкой. Начальная и конечная точки могут располагаться в любом месте документа XML, следовательно, область может пересекать элементы документа XML, не совпадая с узлами дерева. Разумеется, начальная точка должна встретиться в документе раньше конечной точки.

    Точки, области и узлы вместе образуют местоположение. В результате всякого поиска отыскивается некоторое местоположение или набор местоположений.

    Во-вторых, в схему xpointer() введены новые функции range(), stringrange(), range-to(), range-inside (), here(), origin (), start-point(), end-point(), работающие с точками и областями.

    Эти дополнения позволяют гораздо точнее адресовать различные части документа, вплоть до отдельного символа.

    Все действия с точками и областями выполняются с помощью перечисленных функций.

    Адресация на языке XPath

    Для удобной работы с документом XML необходимы средства, позволяющие точно адресовать ту или иную его часть: отдельную точку, множество точек, какой-либо участок или множество участков документа. Такие средства предоставляет язык XPath, разработанный консорциумом W3C. Язык XPath, как и XPointer, - не реализация XML. Его основу составляют выражения различных типов, в числе которых логический, числовой и строковый тип. В выражениях записываются константы, переменные и функции, входящие в состав XPath. Они связываются операциями, характерными для данного типа. В результате вычисления выражения получается указание на какой-то один или сразу несколько участков документа.

    Очень часто выражение строится подобно пути к файлу в файловой системе, откуда и происходит название языка "XML Path", сокращенно XPath. При этом документ XML рассматривается как дерево.

    Дерево документа

    Язык XPath представляет документ в виде дерева, корнем которого служит корневой элемент документа. От корня отходят ветви, заканчивающиеся узлами. Узлами служат, например, вложенные элементы, их атрибуты и тексты, составляющие содержимое корневого элемента. От каждого вложенного элемента отходят свои ветви, рекурсивно повторяющие ветви корневого элемента. Таким образом, у каждого узла может быть только один узел - "предок", причем предком может быть только узел корневого или другого элемента дерева, но не атрибут и не текстовый узел.

    Узлы дерева

    Язык XPath различает семь видов узлов.

  • Узлы документа. Не отождествляйте узел документа с узлом корневого элемента документа. Узел корневого элемента вложен в узел документа наряду с узлами-комментариями и узлами инструкции по обработке. Кроме того, в языке XPath предусмотрена возможность работы с другими типами документов, возможно, содержащими несколько корневых элементов. Имя узла документа совпадает с именем корневого элемента документа.
  • Узлы-элементы. Имя узла-элемента состоит из идентификатора пространства имен, получаемого по префиксу уточненного имени элемента, и локального имени элемента. Это расширенное имя узла. Если у элемента есть атрибут типа ID, то он служит идентификатором узла.
  • Узлы-атрибуты. Их предок - узел-элемент, к которому относятся атрибуты, хотя они не считаются потомками этого узла. Узел-атрибут тоже определяется расширенным именем, полученным из уточненного имени атрибута.
  • Узлы пространств имен. С каждым узлом-элементом связаны узлы тех пространств имен, в область действия которых входит данный элемент. Так же как и узлы-атрибуты, они не считаются потомками узла-элемента, хотя считают его своим предком. Поэтому программа-анализатор, обходя дерево, не будет автоматически просматривать узлы пространств имен. Имя узла пространства имен - это префикс, связанный с ним.
  • Узлы инструкций по обработке. Это отдельные узлы, имена которых - это имена целевых приложений, выполняющих инструкцию. Первая строка пролога документа XML
    <?xml version="1.0"?>
    не считается инструкцией по обработке и не входит в дерево документа.
  • Узлы комментарии. Каждый комментарий заносится в дерево как узел без имени.
  • Текстовые узлы. Это строка символов, записанная в теле элемента между вложенными элементами. У текстовых узлов нет расширенного имени.
  • Узел любого вида можно представить строкой символов. Для каждого вида узла правила представления свои, они перечислены далее.

  • Строка, представляющая узел документа или узел-элемент, состоит из всех строк, представляющих его узлы-потомки текстового вида.
  • Строка, представляющая узел-атрибут, содержит его значение.
  • Строка, представляющая узел пространства имен, содержит его строку URI.
  • Строка узла инструкции по обработке составлена из ее содержимого.
  • Узел-комментарий и текстовый узел сами являются строками, причем начальные символы <!- и конечные символы -> комментария в строку не входят.
  • Выражения, определяющие путь

    Чаще всего выражение языка XPath показывает путь к определяемому участку документа XML, начинающийся в корневом узле документа или каком-то начальном узле. Такие выражения состоят из нескольких шагов поиска, выполняемых последовательно слева направо. Последовательность, полученная на предыдущем шаге, передается следующему шагу, который использует ее как исходный материал для поиска. Шаги в выражении разделены наклонными чертами. Например, выражение

    /contract/section/paragraph

    состоит из трех шагов поиска, содержащих имена элементов contract, section и paragraph. В результате вычисления первого шага этого выражения получится последовательность узлов, вложенных в узел документа contract. На втором шаге из этой последовательности выбираются узлы section, на третьем - узлы paragraph. В результате вычисления всего выражения получается последовательность узлов, состоящая из всех элементов paragraph, вложенных в элементы section, которые, в свою очередь, вложены в элементы contract.

    В общем случае шаг поиска устроен гораздо сложнее. Язык XPath 2.0 различает два вида шагов поиска: шаг, направляемый осью поиска, и шаг, направляемый фильтром. После выполнения шага, направляемого осью, получается последовательность узлов, а после выполнения фильтра в последовательности кроме узлов могут встретиться атомарные значения.

    Шаг, направляемый осью поиска

    Шаг, направляемый осью поиска, состоит из трех частей: оси поиска, теста узла и необязательного предиката. Ось отделяется от теста узла двумя двоеточиями, а предикат записывается после теста узла в квадратных скобках:

    ось: текст узла [предикат].

    Например, шаг поиска может выглядеть так:

    child::section[l]

    В этом примере ось поиска child показывает, что поиск охватывает все узлы, непосредственно вложенные в просматриваемый узел, за исключением узлов-атрибутов и узлов пространств имен, текст узла section выбирает из этих узлов узлы-элементы section, а предикат 1 выбирает первый из встреченных узлов-элементов section.

    Каждая из трех частей шага поиска сужает первоначальную область поиска.

    Ось поиска задает направление поиска, отсчитываемое от текущего узла, и его объем. Например, поиск может идти в сторону вложенных элементов или, наоборот, просматривать родительские узлы. Можно просматривать только атрибуты элементов или только соседние элементы.

    Текст узла выбирает в области поиска, заданной осью, определенные узлы по их имени или типу.

    Предикат содержит условия, по которым проверяет узлы, уже отобранные осью поиска и тестом узла, и делает окончательный выбор.

    Шаг, направляемый фильтром

    Шаг, направляемый фильтром, использует вместо оси и теста узла первичное выражение:

    Первичное выражение[Предикат]

    Первичное выражение выдает в качестве результата последовательность узлов и/или атомарных значений, которая затем фильтруется предикатом.

    Первичное выражение - это:

  • число типа xs:integer, xs:decimal, xs:double ;
  • строка символов типа xs:string ;
  • значение переменной, начинающееся со знака доллара $;.
  • вызов функции;
  • наконец, произвольное выражение, заключенное в скобки.
  • Поэтому на шаге, направляемом фильтром, можно применять любое выражение, надо только заключить его в скобки.

    Язык запросов XQuery

    После того как язык XML научился делать ссылки на языке XLink, создавать указатели XPointer на каждую точку документа и тонко адресовать любые части документа с помощью XPath, остался последний шаг: научиться извлекать найденную по адресу информацию из любых участков документа и оформлять ее в виде элементов документа XML. Язык XQuery как раз и призван сделать этот последний шаг.

    Поскольку перед извлечением информации из документа надо ее отыскать язык XQuery разрабатывался в тесной связи с языком XPath 2.0. Более того, большинство конструкций языка XPath 2.0 созданы в расчете на написание запросов. Многие выражения XPath, такие как выражение //ААА/ВВВ, делают запрос на поиск информации в документе XML. Поэтому язык XQuery можно считать расширением язык XPath 2.0. В нем можно применять почти все, что есть в языке XPath 2.0.

    Единственное ограничение - в первой версии языка XQuery, выражения, определяющие путь, можно направлять только по 6 осям из 13, имеющихся в языке XPath: child (по умолчанию), descendant, attribute, self, descendant-or-self и parent.

    Основной единицей языка XQuery, как и языка XPath, служит выражение, причем набор выражений, перечисленных через запятую, тоже считается выражением. Это так называемая "операция запятая", объединяющая несколько выражений в одно, вычисляемое последовательно слева направо. Результат вычисления выражения, как и в языке XPath, - последовательность узлов и/или атомарных значений. Виды узлов и типы атомарных значений таковы же, как и в XPath 2.0.

    Запрос в языке XQuery тоже оформляется как выражение. Разница заключается в том, что и результате вычисления выражения получается последовательность, а в результате выполнения запроса должен получиться один или несколько документов XML. Значит, в первую очередь язык XQuery должен научиться конструировать элементы XML. За это отвечают конструкторы.

    Конструкторы

    Конструктор узлов - это выражение, которое создает и добавляет к дереву документа новые узлы.

    Конструкторы могут создавать узлы каждого вида за исключением узлов пространств имен. При этом узел-элемент можно создать средствами прямого или вычисляемого конструктора, узел-атрибут, корневой узел документа и текстовый узел - только вычисляемого конструктора, а узлы-комментарии и узлы инструкций по обработке просто записываются в конструкторе прямо в том виде, в каком они затем появятся в документе.

    Прямой конструктор элемента

    Самый простой способ сконструировать элемент XML- это записать его в явном виде с открывающим тегом, атрибутами, содержимым и закрывающим тегом. Эта форма называется прямым конструктором элемента.

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

    <аgе>{10 + 20 }</аgе>

    Заметьте, что если не написать фигурные скобки, то выражение не будет вычисляться, а попадет в конструируемый элемент как простой текст.

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

    В общем случае прямой конструктор элемента состоит из элемента XML. В элемент могут быть вложены другие элементы, выражения в фигурных скобках и наборы символов - содержимое элемента. Конструктор преобразует наборы символов в текстовые узлы, вычисляет выражения, рекурсивно обрабатывает вложенные элементы и формирует новый узел-элемент с вложенными узлами-элементами, узлами-атрибутами и текстовыми узлами.

    Каждое выражение после вычисления даст последовательность узлов и/или атомарных значений. Для узлов из этой последовательности конструктор создаст точную копию со всеми их узлами-потомками, узлами-атрибутами, углами пространств имен, если они есть. Для каждой подпоследовательности идущих подряд атомарных значений конструктор создаст один текстовый узел, содержащий строковые представления атомарных значений с пробелом между ними.

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

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

    После этого прямой конструктор создает узел-элемент с узлами-потомками из последовательности, полученной на предыдущем шаге.

    В атрибутах конструктора тоже можно записать выражения в фигурных скобках, например:

    <person id="92-3456" sex="{ /notion/sex[1]}">

    Выражение вычисляется, каждый элемент полученной последовательности представляется строкой, а строки разделяются пробелами. Кроме выражений, значение атрибута может содержать наборы символов, которые сцепляются со строками, полученными из выражений, без всяких пробелов:

    <person id="9{l + 1}-3456" sex="male">

    Вычисляемый конструктор

    Прямой конструктор использует заданные заранее имена элементов и атрибутов. Иногда это неудобно или невозможно сделать. В таких случаях применяют вычисляемые конструкторы.

    Вычисляемые конструкторы могут создавать узлы четырех видов: узлы-элементы, узлы-атрибуты, корневые узлы документа или текстовые узлы. Поэтому в начале конструктора надо указать вид создаваемого узла одним из слов element, attribute, document или text. После этого слова в фигурных скобках записывается выражение, конструирующее узел. Для узла-элемента и узла-атрибута нужно еще записать его имя, которое тоже можно задать выражением.

    Страницы:

    Для того чтобы язык XML мог полностью задействовать свой потенциал, необходимо иметь способ реализации ссылок между документами XML, указатели на них и запросы к ним.

    В связи с тем, что в документах XML сохраняется все 6ольше информации, возникает необходимость в разработке способа получения структурированного доступа к этой информации. Также необходимы способ определения связей между частями документов и обращения к фрагментам (или ресурсам) внутри документов, которые связаны с другими ресурсами. Эти ресурсы могут быть фрагментами как того же, так и других документов, или вовсе не относиться к формату XML.

    XML Information Set

    Проект The XML Information Set, или Infoset, - рабочий проект W3C описания различных фрагментов информации, составляющих правильно оформленный документ XML.

    Целью проекта является создание общего словаря для описания содержания документов XML. Любой процессор XML, возвращающий информацию о содержании документа XML, будет описывать содержание в терминах данных информационных пунктов.

    Информационные пункты

    Имеющиеся пятнадцать различных пунктов информации совместно составляют правильно оформленный документ XML. Некоторые из этих пунктов должны присутствовать в грамматически разобранном (проанализированном) представлении документа XML, чтобы он мог быть конгруэнтным (по стандартам W3C ) оригинальному документу, другие можно при желании опустить. Назовем типы информации (информационных пунктов):

  • Один информационный пункт документа (обязателен)
  • Один или больше информационных пунктов элементов (обязательно)
  • Информационные пункты атрибутов (обязательны)
  • Информационные пункты команд обработки (обязательны)
  • Информационные пункты символов (обязательны)
  • Ссылка на пропущенные информационные пункты сущностей (обязательны)
  • Информационные пункты комментариев (необязательны)
  • Информационный пункт декларации пункта документа (необязательны)
  • Информационные пункты объектов (обязательны для не анализируемых сущностей, необязательны для анализируемых сущностей)
  • Информационные пункты нотации (обязательны)
  • Информационные пункты маркера начала сущности (необязательны)
  • Информационные пункты маркера конца сущности (необязательны)
  • Информационные пункты маркера начала раздела CDATA (необязательны)
  • Информационные пункты маркера конца раздела CDATA (необязательны)
  • Информационные пункты декларации пространства имен (обязательны)
  • Необязательные пункты являются необязательными в том смысле, что они требуются в грамматически разобранном представлении документа для того, чтобы оно было достаточно конгруэнтно оригиналу в соответствии с определением InfoSet консорциума W3C.

    Документ

    Информационный пункт документа должен быть всегда ровно один, он содержит информацию о документе в целом и имеет следующие свойства:

  • Список порожденных информационных пунктов в порядке их следования в оригинальном документе. Сюда входит, по крайней мере, один информационный пункт элемента. Кроме того, список должен содержать все информационные пункты команд обработки, определенные вне контекста корневого элемента документа. По желанию разработчика в этот список могут входить также информационные пункты комментариев, находящихся вне корневого элемента документа, а также информационные пункты декларации типа документа (если в оригинальном документе такая информация определена).
  • Неупорядоченный набор из информационных пунктов нотаций для всех нотаций документа.
  • Неупорядоченный набор из информационных пунктов сущностей для всех не анализируемых сущностей документа. По желанию разработчика в этот список могут входить также информационные пункты для анализируемых сущностей, для сущности документа и для внешнего множества DTD.
  • При желании разработчик может включить сюда также идентификатор URI обрабатываемого документа.
  • Элемент

    Для каждого элемента документа XML должен существовать один информационный пункт.

    Информационные пункты элемента имеют следующие свойства:

  • Упорядоченный список информационных пунктов порожденных элементов, команд обработки, ссылок на пропущенные сущности и символов в порядке их следования в документе. Этот список может быть пустым. При желании разработчика в него можно включить также информационные пункты комментариев. Кроме того, в список могут входить также информационные пункты маркеров: начала сущности, конца сущности, начала данных типа CDATA и конца данных типа CDATA ; эти пункты могут входить только соответствующими парами (не должно быть маркера начала без маркера конца и наоборот).
  • Не упорядоченный список информационных пунктов атрибутов, по одному для каждого атрибута элемента. В набор входят также и атрибуты по умолчанию. Обратите внимание: если у элемента имеется атрибут пространства имен, а анализатор не распознает пространства имен, то атрибут включен в этот список для спецификации пространства имен; в противном случае он не будет туда включен. Этот список может быть пустым.
  • Содержащийся в имени элемента фрагмент, соответствующий универсальному идентификатору ресурса ( URI ), предоставляемый процессором пространства имен. Если анализатор не осуществляет обработки пространств имен или если пространство имен для элемента не определено, URI будет равен нулю.
  • Локальная часть имени элемента. Если анализатор не обрабатывает пространства имен, эта часть содержит все имя целиком (включая название пространства имен и двоеточие при наличии идентификатора пространства имен в имени элемента). В противном случае она представляет собой только локальную часть имени (после двоеточия) или имя целиком (если пространство имен не указано).
  • Неупорядоченный набор ссылок на информационные пункты деклараций пространства имен. Они соответствуют пространствам имен, объявленным в составе этого элемента.
  • По желанию разработчика сюда может входить также неупорядоченный список информационных пунктов деклараций пространств имен, которые соответствуют пространствам имен, объявленным в области действия этого элемента (т.е. в самом элементе или в одном из его предков).
  • Атрибут

    У каждого атрибута документа должен быть один информационный пункт. Если процессор распознает пространства имен, то используемые для их определения атрибуты в списке данных информационных пунктов представлены не будут.

    У информационных пунктов атрибутов имеются следующие свойства:

  • Фрагмент URI имени атрибута, при наличии.
  • Локальная часть имени атрибута.
  • Упорядоченный список информационных пунктов символов для каждого символа в (нормализованном) значении атрибута. При желании в этот список можно также включить информационные пункты маркеров начала и конца сущностей для всех ссылок на объекты в значении атрибута.
  • По желанию разработчика можно указать флаг, определяющий, значение этого атрибута определено либо задано по умолчанию в определении DTD или в схеме.
  • По желанию разработчика можно указать значение атрибута по умолчанию из DTD.
  • По желанию разработчика можно указать тип, объявленный для атрибута в определении DTD.
  • Команды обработки

    Для каждой команды обработки документа должен существовать информационный пункт команды обработки. Декларация ХМL и декларации внешних анализируемых объектов сами по себе командами обработки не считаются.

    Информационные пункты команд обработки содержат следующие свойства:

  • Цель команды обработки. Это первый знак, следующий за символами "<?" в теге команды обработки.
  • Содержание команды обработки. Это остальной текст в теге перед закрывающими символами "?>", из которого удалено предшествующее ему пустое пространство. Может представлять собой, пустую строку.
  • Разработчик может указать также идентификатор URI объекта, первоначально содержавшего команду обработки (если команда обработки объявлена в тексте, это будет URI обрабатываемого документа, если он известен).
  • Ссылка на пропущенную сущность

    Информационный пункт ссылки на пропущенную сущность должен быть определен для каждой ссылки на сущность, которая либо не была интерпретирована анализатором, не осуществляющим проверку на допустимость, либо в связи с тем, что декларация неизвестной сущности не была прочитана (например, вследствие недоступности), либо потому, что анализатор не включает внешние анализируемые сущности.

    У информационных пунктов ссылок на неизвестные сущности имеются следующие свойства:

  • Имя сущности, на которую ссылаются.
  • По желанию разработчика можно включить также информационный пункт ссылки на сущность для неразвернутой внешней анализируемой сущности, если анализатор прочитал декларацию.
  • Символ

    Для каждого символа документа, не являющегося символом разметки, должен быть информационный пункт символа (обратите внимание - один информационный пункт для каждого отдельного символа). На практике расположенные рядом символы объединяют в строки или конструкции текста, а не перечисляют по отдельности (в соответствии со спецификацией W3C Infoset, это допустимо).

    Информационные пункты символов содержат свойства:

  • Код символа в соответствии со стандартом ISO 10646 (Unicode).
  • Флаг, показывающий, является ли символ пустым пространством внутри содержания или нет. Проверяющие на допустимость анализаторы должны всегда устанавливать этот флаг; не проверяющие на допустимость при желании могут установить этот флаг равным false.
  • При желании разработчик может указать, был ли этот символ включен как часть предопределенной сущности XML.
  • Комментарий

    Для каждого комментария в документе можно определить один информационный пункт комментария.

    Информационный пункт комментария содержит свойство - содержание этого комментария.

    Декларация типа документа

    Один информационный пункт декларации типа документа можно указать при желании разработчика и при наличии такой декларации.

    У информационного пункта декларации типа документа могут быть следующие свойства:

  • Ссылка на информационный пункт сущности для внешнего подмножества DTD.
  • Упорядоченный список ссылок на информационные пункты комментариев и команд обработки, присутствующие в DTD.
  • Сущность

    Не анализируемые внешние сущности должны быть представлены в виде информационных пунктов сущностей. Для каждой другой сущности в документе также может существовать информационный пункт объекта. Если сущность была объявлена несколько раз, для создания информационного пункта сущности используется только первая ее декларация.

    Информационные пункты сущностей содержат такие свойства:

  • Тип сущности (внутренняя параметрическая сущность, внешняя параметрическая сущность, внутренняя общая сущность, внешняя общая сущность, не анализируемая сущность, сущность документа или внешнее подмножество DTD ).
  • Имя сущности. Равно неопределенному значению (null), если информационный пункт сущности представляет собой сущность документа или внешнее определение DTD.
  • Системный идентификатор сущности. Для внутренних сущностей это свойство равно null; для сущности документа оно может быть равно null, а может содержать системный идентификатор документа.
  • Общий идентификатор сущности, если он есть. Для внутренних сущностей равен null.
  • Если сущность является не анализируемой, то ссылка - на информационный пункт нотации. Для других типов сущностей равен null.
  • Базовый идентификатор URI сущности. Если сущность является внутренней, то значение этого идентификатора должно быть равно null
  • По желанию разработчика можно включить текст сущности, если это внутренняя сущность.
  • По желанию разработчика можно включить также название кодировки символов, в которой выражена сущность.
  • Можно включить также указание на статус автономности сущности. Допустимы значения "yes", "no" и "not present".
  • Нотация

    Для каждой объявленной в определении DTD нотации должен быть один информационный пункт нотации.

    Информационные пункты нотации содержат следующие свойства:

  • Имя нотации
  • Системный идентификатор нотации, или null, если он не был определен
  • Общий идентификатор нотации, или null, если он не был определен
  • Базовый идентификатор URI, соответствующий нотации
  • Маркер начала сущности

    Для того чтобы отметить начало текста, вставляемого из внешней анализируемой сущности, имеется маркер начала сущности. Маркер не используется для параметрических сущностей.

    Информационный пункт маркера начала сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.

    Маркер конца объекта

    Для того чтобы отметить конец текста, вставляемого из внешней анализируемой сущности, существует маркер конца сущности. Маркер не используется для параметрических сущностей.

    Информационный пункт маркера конца сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.

    Маркер начала раздела CDATA

    Для того чтобы показать начало текста, включенного в раздел DATA, используется один маркер начала объекта. Информационный пункт маркера начала раздела CDATA не имеет свойств.

    Маркер конца раздела CDATA

    Для того чтобы показать конец текста, включенного в раздел CDATA, используется один маркер конца сущности. Информационный пункт маркера конца раздела CDATA не имеет свойств.

    Декларация пространства имен

    Для каждого пространства имен существует одна декларация пространства имен, она объявляется (или подразумевается) как атрибут элемента.

    Информационный пункт декларации пространства имен имеет следующие свойства:

  • Объявляемое пространство имен. Это фрагмент имени атрибута, следующий за префиксом xmlns:.
  • Абсолютный идентификатор URI объявляемого пространства имен. Необходимо сообщить либо это свойство, либо следующее далее свойство потомка (описывающее текст), либо то и другое.
  • Упорядоченный список символьных ссылок на информационные пункты символов, которые составляют содержание значения атрибута. В него могут входить также маркеры начала и конца сущности, показывающие расположение ссылок на сущности. Должно присутствовать либо это, либо предыдущее свойство. Консорциум W3C добавил это свойство, чтобы обеспечить возможность определять пространства имен в будущих версиях не по URI.
  • Важность проекта Information Set

    Все эти информационные пункты и свойства практически идентичны модели DOM. Фактически все различные технологии, определенные консорциумом W3C для доступа к документам XML - XML DOM, XLink, XPath, XPointer, а также XSLT - являются производными от базовой структуры, описанной в спецификации XML Information Set. Чтобы извлечь максимум из предоставляемых этими технологиями функциональных возможностей, необходимо рассматривать документы XML не как потоки текстовой информации, а именно как описанные ранее объекты.

    Несмотря на то, что стандарт подробно описывает соединения между объектами, он не определяет какой-либо конкретной реализации.

    Чтобы использовать различные технологии, определенные консорциумом W3C для доступа к документам XML и манипулирования ими, сначала необходимо изучить определения консорциума W3C в спецификации Infoset. Как только вы перестанете считать документы XML текстом и начнете думать о них как о связанных информационных пунктах, вы обнаружите, что механизмы связывания и запросов для доступа к документам XML становятся очень естественными и интуитивными. В этих технологиях используются пункты информационного набора, описанные в стандарте Infoset ; они позволяют манипулировать документами XML и адресовать их, используя представленные в пунктах связи типа "родитель-потомок" для навигации по этим документам.

    Создание ссылок на языке XLink

    Язык XLink позволяет создать ссылку в одном, а использовать в других документах. Ссылка может указывать сразу на несколько документов. Сослаться можно не только на документ XML, но и на любой информационный ресурс: изображение, чертеж, программу. Можно организовать ссылку, связывающую другие документы, например, ссылка, записанная в документе docl.xml, может установить связь между документом doc2.xml и документом doc3.xml. Кроме того, язык XLink отмечает направление ссылки и позволяет организовать обратные ссылки. Эти возможности делают язык XLink чрезвычайно мощным, способным удовлетворить нужды самого привередливого разработчика.

    Пространство имен языка XLink

    Интересная особенность языка XLink заключается в том, что он не вводит новые элементы, а определяет только атрибуты, которые можно использовать в любых определяемых вами элементах. Каждый элемент в документе XML, использующий атрибуты языка XLink, становится ссылкой. Атрибуты введенные языком XLink, находятся в пространстве имен http://www.w3.org/1999/xlink. Как обычно, перед использованием атрибутов надо связать это пространство имен с каким-либо префиксом. Очень часто этот префикс называется xlink

    <someElement xmlns:xlink="http://www.w3.org/1999/xlink>
    someText"
    </someElement>

    Всего в языке XLink объявлено десять атрибутов:

  • атрибут type задает тип ссылки;
  • атрибут href описывает адрес ресурса, с которым связана ссылка;
  • атрибут show определяет способ показа полученного по ссылке ресурса;
  • атрибут actuate устанавливает момент активизации ссылки;
  • атрибуты label, from, to отмечают и указывают начальные и конечные пункты ссылки;
  • атрибуты role, arcrole, title объясняют смысл ссылки.
  • Разумеется, кроме атрибутов языка XLink в объявляемых элементах-ссылках можно объявлять и любые другие атрибуты.

    Создание банка ссылок

    При создании какого-либо документа на языке HTML, назовем его для определенности doc.html, в него вставляются гиперссылки на предыдущие, ранее созданные, документы и изображения. Пусть эти ресурсы лежат в файлах oldl.html, old2.html, imgl.gif. Через некоторое время появляются новые документы, назовем их newl.html, new2.html, на которые необходимо сослаться из документа doc.html. Для этого придется отыскать файл doc.html и внести в него новые ссылки. Это очень неудобно. Не говоря уже о том, что файл doc.html может быть недоступен, его уже могли скопировать на множество сайтов. Придется вносить изменения во все копии, что совершенно невозможно.

    Язык XLink, в котором можно сделать ссылки и в прямом, и в обратном направлении, позволяет создать обратные ссылки из новых документов на старый документ. Но это не лучший выход из положения, потому что старый документ при каждом открытии должен отыскать и просмотреть новые документы в поисках этих ссылок. Это требует времени и знания тех адресов, где лежат эти новые документы.

    К счастью, язык XLink предлагает другой, более удобный выход из этой ситуации. Мы выносим все ссылки в отдельный файл - "банк ссылок" - и в случае необходимости изменяем ссылки только в этом файле. Все документы, которым нужны ссылки, обращаются за ними в банк ссылок.

    Уточненные ссылки XPointer

    Язык XLink позволяет организовать только внешние ссылки на информационный ресурс. Они не могут сослаться на определенное место удаленного документа или на какое-то произвольное место того документа, в котором они записаны. Такие ссылки могут быть полезны, поскольку очень часто в документах нужно организовать ссылку на определенное место того же самого документа, скажем, при создании оглавления, предметного указателя, глоссария.

    В языке HTML <а>. В нем атрибутом href указывается метка того места документа, на которое мы хотим перейти. Перед меткой ставится символ "решетка" #.

    Например:
    <a href="#ref0012"> Пункт оглавления </a>

    В том месте документа, на которое мы хотим перейти, записывается тег <а> с атрибутом name и той же меткой:

    <a name="ref0012"></a>

    Подобную метку можно записать в удаленном документе, допустим, в файле remfile.html, и ссылаться на нее следующим образом:

    <a href="http://some.com/pub/remfile.html#ref0012"> Пункт оглавления </а>

    Браузер загрузит документ remfile.html и покажет ту его часть, в которой записан элемент.

    <a name="ref0012"></a>

    Аналогичная конструкция, разумеется, есть и в XML. По правилам XML метки создаются с помощью атрибутов типа ID, которые можно объявить в любом элементе.

    Ссылки на помеченные элементы указываются атрибутами типа IDREF или IDREFS, которые тоже можно объявить в любом элементе. Проверяющий анализатор, просматривая документ XML, следит за соответствием меток и ссылок на них, отмечая как ошибку ссылку на несуществующую метку. Знак решетки # в ссылках записывать не нужно, сам тип IDREF показывает, что значение атрибута - ссылка.

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

    <item ref="ref0012"> ????? ?????????? </item>
    ? ???????? ??????? ????? ???:
    <ch id="ref0012" />
    ?????????? ????????? item ? ch ?? ????? XSD ????? ????? ???:
    <xsd:element name="item"> 
    <xsd:complexType> 
    <xsd:simpleContent>
    <xsd:extension base="xsd:string">
    <xsd:attribute name="ref" type="xsd:IDREF"/>
    </xsd:extension>
    </xsd:simpleContent>
    </xsd:complexType> 
    </xsd:element>
    <xsd: element name=="ch">
    <xsd:attribute name="id" type="xsd:ID" use="required" /> 
    </xsd:element>

    Эта простая конструкция языка XML очень скоро перестала удовлетворять разработчиков документов XML. Им потребовалось ссылаться:

  • на определенную точку - букву, символ, позицию - внутри элемента;
  • на множество точек, выбранных по образцу, скажем, на каждое появление в тексте слова "монитор";
  • не на определенный элемент или точку внутри элемента, а на какую-то часть документа, границы которой не совпадают с началом и концом элемента;
  • на что-нибудь вроде "третьего абзаца пятого параграфа предыдущей версии документа".
  • Кроме того, не всегда возможно расставлять в элементах атрибуты типа ID. В конце концов, документ не всегда доступен, или у разработчика просто может отсутствовать право записи в документ, на который надо сослаться.

    Следуя духу XML, консорциум W3C создал для записи таких уточненных ссылок и меток язык XPointer. Общую структуру языка описывает рекомендация "XPointer Framework".

    XPointer не является реализацией XML. Он не определяет никакие типы данных и не объявляет элементы и атрибуты. Он задает только правила записи меток и обращения к ним с помощью ссылок языка XLink.

    На языке XPointer метки называются указателями. XPointer определяет два вида указателей: простые указатели и указатели, основанные на схеме. Рассмотрим подробнее каждый из этих видов.

    Простые указатели

    Простой указатель представляет собой имя типа NCName языка XSD, состоящее из букв, цифр, точек, дефисов и знаков подчеркивания. Имя должно начинаться с буквы. Как обычно в XML, указатель вписывается в любом атрибуте-идентификаторе типа ID, который может содержаться в любом элементе документа XML. Например:

    <someElem myid="label02">
    Содержимое элемента 
    </someElem>

    Атрибут-указатель в примере myid обязательно должен быть объявлен при описании схемы документа. Объявить его следует с типом ID.

    Использование простых указателей в ссылках

    Ссылки на информационный ресурс, содержащий указатели, записываются по правилам языка XLink, в который добавлена конструкция, взятая из языка HTML, а именно в ссылке на ресурс перед указателем ставится знак решетки #:

    <myLink xlink:type="simple"
    xlink:href="mydoc.xml#label02" />

    Ссылка, записанная в том же самом документе mydoc.xml, начинается с решетки и выглядит так:

    <myLink xlink:type="simple"
    xlink:href="#label02" />

    Если в документе записано несколько одинаковых указателей label02, то ссылка будет связана с первым из них.

    Как видите, простые указатели языка XPointer только дублируют конструкции, давно применяемые в HTML и XML. Все новые возможности языка реализованы через указатели, основанные на схеме.

    Указатели, основанные на схеме

    Указатели, основанные на схеме, состоят, как и следует из их названия, из одной или нескольких схем, записанных через пробелы. Вот пример:

    xpointer(/book/chapter/section)  element (color/3)

    В этом примере указатель состоит из двух схем. Первая схема задает ссылку на элемент section, вложенный в элемент chapter, который, в свою очередь, вложен в концевой элемент book.

    Вторая схема ссылается на третий по счету элемент из всех непосредственно вложенных в помеченный простым указателем color элемент.

    Использование указателей в ссылках

    Указатели, основанные на схеме, используются точно так же, как и простые указатели. Они записываются в атрибутах элементов-ссылок после пути к файлу и отделяются от него "решеткой":

    <myLink xlink:type="simple"
    	xlink:href="mydoc.xml#element(color/3) "/>

    Понятие схемы в языке XPointer

    Слово "схема" в языке XPointer получило новое значение. Это запись вида

    element (color/3)

    похожая на запись функции и состоящая из имени схемы и данных, записанных в скобках.

    Схемы, записанные в указателе, просматриваются последовательно до тех пор, пока не будет найдена точка в документе, отвечающая какой-либо схеме. После этого просмотр указателя прекращается, оставшиеся схемы не рассматриваются. В приведенном выше примере, если будет найден элемент section, то схема element (color/3) рассматриваться уже не будет.

    Имя схемы - это уточненное имя типа Qname, состоящее из необязательного префикса, связанного с идентификатором пространства имен, и локальной части, отделенной от префикса двоеточием.

    Имена без префиксов зарезервированы за схемами, которые определяются в рекомендациях консорциума W3C. Каждая схема, предложенная консорциумом, описывается отдельной рекомендацией. Разработчики могут вводить свои схемы, снабжая их имена префиксами.

    Смысл и правила записи данных зависят от вида схемы. Есть только одно общее правило, вытекающее из того, что данные записываются в скобках - все скобки, относящиеся к данным, должны быть парными или предваряться символом "каре" ("крышечкой"): xxx^(yyy или yyy^)xxx. Если же в данных встречается символ каре, то его следует удваивать: xxx^^yyy.

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

    Схема element()

    Схема element() реализует потребность ссылаться на элемент документа XML примерно в таком стиле: "сослаться на второй абзац третьего параграфа договора №5". Реализация очень проста и выглядит следующим образом:

    element(/1/3/2)

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

    Запись вида /1/3/2 называется последовательностью вложений. Она напоминает запись пути к файлу. Наклонная черта отмечает вложенный элемент подобно вложенному каталогу файловой системы, но вместо имени вложенного каталога или файла стоит натуральное число. Число, записанное за наклонной чертой, показывает порядковый номер непосредственно вложенного элемента. Отсчет элементов начинается с 1.

    Поскольку в хорошо оформленном документе XML может быть только один корневой элемент, последовательность вложений обычно начинается с наклонной черты и единицы: /l. За следующей наклонной чертой перечисляются элементы, непосредственно вложенные в корневой элемент и т. д.

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

    element (sect3a/2)

    Наконец, данные в схеме element () могут состоять только из простого указателя:

    element (sect3a)

    Это эквивалентно написанию простого указателя без всякой схемы.

    Схема xpointer()

    Схема xpointer() использует для создания указателей и ссылок на них мощные средства адресации элементов и других частей документа, предоставляемые языком XPath. В схеме xpointer() данными, записываемыми в скобках, могут служить любые выражения, допускаемые в языке XPath, а также их расширения, введенные в язык XPointer.

    Дерево документа

    Язык XPath рассматривает документ XML как дерево. Корнем дерева будет корневой элемент документа, а узлами - вложенные элементы, содержимое элемента (текстовый узел) или его атрибуты. Кроме того, в узлах дерева могут находиться комментарии, инструкции по обработке, пространства имен.

    Схема element() не учитывает текстовые узлы и узлы-атрибуты. Она отмечает только вложенные элементы. Но схема xpointer() должна строго следовать правилам языка XPath и учитывать текстовые узлы, даже если они содержат только пробельные символы. Впрочем, многие программы-анализаторы языка XPointer не следуют этому правилу. Например, функция last() разными программами-анализаторами будет вычислена по-разному в зависимости от того, как они построят дерево документа.

    Дополнения языка XPointer

    Исторически сложилось так, что язык XPath был создан на два года раньше языка XPoinler. Поэтому создатели языка XPointer внесли в него дополнения, расширившие конструкции языка XPath.

    Во-первых, кроме узлов дерева, язык XPointer рассматривает точки (points) и области (ranges).

    Точкой язык XPointer называет позицию между символами документа XML.

    Область занимает пространство между двумя точками: начальной точкой и конечной точкой. Начальная и конечная точки могут располагаться в любом месте документа XML, следовательно, область может пересекать элементы документа XML, не совпадая с узлами дерева. Разумеется, начальная точка должна встретиться в документе раньше конечной точки.

    Точки, области и узлы вместе образуют местоположение. В результате всякого поиска отыскивается некоторое местоположение или набор местоположений.

    Во-вторых, в схему xpointer() введены новые функции range(), stringrange(), range-to(), range-inside (), here(), origin (), start-point(), end-point(), работающие с точками и областями.

    Эти дополнения позволяют гораздо точнее адресовать различные части документа, вплоть до отдельного символа.

    Все действия с точками и областями выполняются с помощью перечисленных функций.

    Адресация на языке XPath

    Для удобной работы с документом XML необходимы средства, позволяющие точно адресовать ту или иную его часть: отдельную точку, множество точек, какой-либо участок или множество участков документа. Такие средства предоставляет язык XPath, разработанный консорциумом W3C. Язык XPath, как и XPointer, - не реализация XML. Его основу составляют выражения различных типов, в числе которых логический, числовой и строковый тип. В выражениях записываются константы, переменные и функции, входящие в состав XPath. Они связываются операциями, характерными для данного типа. В результате вычисления выражения получается указание на какой-то один или сразу несколько участков документа.

    Очень часто выражение строится подобно пути к файлу в файловой системе, откуда и происходит название языка "XML Path", сокращенно XPath. При этом документ XML рассматривается как дерево.

    Дерево документа

    Язык XPath представляет документ в виде дерева, корнем которого служит корневой элемент документа. От корня отходят ветви, заканчивающиеся узлами. Узлами служат, например, вложенные элементы, их атрибуты и тексты, составляющие содержимое корневого элемента. От каждого вложенного элемента отходят свои ветви, рекурсивно повторяющие ветви корневого элемента. Таким образом, у каждого узла может быть только один узел - "предок", причем предком может быть только узел корневого или другого элемента дерева, но не атрибут и не текстовый узел.

    Узлы дерева

    Язык XPath различает семь видов узлов.

  • Узлы документа. Не отождествляйте узел документа с узлом корневого элемента документа. Узел корневого элемента вложен в узел документа наряду с узлами-комментариями и узлами инструкции по обработке. Кроме того, в языке XPath предусмотрена возможность работы с другими типами документов, возможно, содержащими несколько корневых элементов. Имя узла документа совпадает с именем корневого элемента документа.
  • Узлы-элементы. Имя узла-элемента состоит из идентификатора пространства имен, получаемого по префиксу уточненного имени элемента, и локального имени элемента. Это расширенное имя узла. Если у элемента есть атрибут типа ID, то он служит идентификатором узла.
  • Узлы-атрибуты. Их предок - узел-элемент, к которому относятся атрибуты, хотя они не считаются потомками этого узла. Узел-атрибут тоже определяется расширенным именем, полученным из уточненного имени атрибута.
  • Узлы пространств имен. С каждым узлом-элементом связаны узлы тех пространств имен, в область действия которых входит данный элемент. Так же как и узлы-атрибуты, они не считаются потомками узла-элемента, хотя считают его своим предком. Поэтому программа-анализатор, обходя дерево, не будет автоматически просматривать узлы пространств имен. Имя узла пространства имен - это префикс, связанный с ним.
  • Узлы инструкций по обработке. Это отдельные узлы, имена которых - это имена целевых приложений, выполняющих инструкцию. Первая строка пролога документа XML
    <?xml version="1.0"?>
    не считается инструкцией по обработке и не входит в дерево документа.
  • Узлы комментарии. Каждый комментарий заносится в дерево как узел без имени.
  • Текстовые узлы. Это строка символов, записанная в теле элемента между вложенными элементами. У текстовых узлов нет расширенного имени.
  • Узел любого вида можно представить строкой символов. Для каждого вида узла правила представления свои, они перечислены далее.

  • Строка, представляющая узел документа или узел-элемент, состоит из всех строк, представляющих его узлы-потомки текстового вида.
  • Строка, представляющая узел-атрибут, содержит его значение.
  • Строка, представляющая узел пространства имен, содержит его строку URI.
  • Строка узла инструкции по обработке составлена из ее содержимого.
  • Узел-комментарий и текстовый узел сами являются строками, причем начальные символы <!- и конечные символы -> комментария в строку не входят.
  • Выражения, определяющие путь

    Чаще всего выражение языка XPath показывает путь к определяемому участку документа XML, начинающийся в корневом узле документа или каком-то начальном узле. Такие выражения состоят из нескольких шагов поиска, выполняемых последовательно слева направо. Последовательность, полученная на предыдущем шаге, передается следующему шагу, который использует ее как исходный материал для поиска. Шаги в выражении разделены наклонными чертами. Например, выражение

    /contract/section/paragraph

    состоит из трех шагов поиска, содержащих имена элементов contract, section и paragraph. В результате вычисления первого шага этого выражения получится последовательность узлов, вложенных в узел документа contract. На втором шаге из этой последовательности выбираются узлы section, на третьем - узлы paragraph. В результате вычисления всего выражения получается последовательность узлов, состоящая из всех элементов paragraph, вложенных в элементы section, которые, в свою очередь, вложены в элементы contract.

    В общем случае шаг поиска устроен гораздо сложнее. Язык XPath 2.0 различает два вида шагов поиска: шаг, направляемый осью поиска, и шаг, направляемый фильтром. После выполнения шага, направляемого осью, получается последовательность узлов, а после выполнения фильтра в последовательности кроме узлов могут встретиться атомарные значения.

    Шаг, направляемый осью поиска

    Шаг, направляемый осью поиска, состоит из трех частей: оси поиска, теста узла и необязательного предиката. Ось отделяется от теста узла двумя двоеточиями, а предикат записывается после теста узла в квадратных скобках:

    ось: текст узла [предикат].

    Например, шаг поиска может выглядеть так:

    child::section[l]

    В этом примере ось поиска child показывает, что поиск охватывает все узлы, непосредственно вложенные в просматриваемый узел, за исключением узлов-атрибутов и узлов пространств имен, текст узла section выбирает из этих узлов узлы-элементы section, а предикат 1 выбирает первый из встреченных узлов-элементов section.

    Каждая из трех частей шага поиска сужает первоначальную область поиска.

    Ось поиска задает направление поиска, отсчитываемое от текущего узла, и его объем. Например, поиск может идти в сторону вложенных элементов или, наоборот, просматривать родительские узлы. Можно просматривать только атрибуты элементов или только соседние элементы.

    Текст узла выбирает в области поиска, заданной осью, определенные узлы по их имени или типу.

    Предикат содержит условия, по которым проверяет узлы, уже отобранные осью поиска и тестом узла, и делает окончательный выбор.

    Шаг, направляемый фильтром

    Шаг, направляемый фильтром, использует вместо оси и теста узла первичное выражение:

    Первичное выражение[Предикат]

    Первичное выражение выдает в качестве результата последовательность узлов и/или атомарных значений, которая затем фильтруется предикатом.

    Первичное выражение - это:

  • число типа xs:integer, xs:decimal, xs:double ;
  • строка символов типа xs:string ;
  • значение переменной, начинающееся со знака доллара $;.
  • вызов функции;
  • наконец, произвольное выражение, заключенное в скобки.
  • Поэтому на шаге, направляемом фильтром, можно применять любое выражение, надо только заключить его в скобки.

    Язык запросов XQuery

    После того как язык XML научился делать ссылки на языке XLink, создавать указатели XPointer на каждую точку документа и тонко адресовать любые части документа с помощью XPath, остался последний шаг: научиться извлекать найденную по адресу информацию из любых участков документа и оформлять ее в виде элементов документа XML. Язык XQuery как раз и призван сделать этот последний шаг.

    Поскольку перед извлечением информации из документа надо ее отыскать язык XQuery разрабатывался в тесной связи с языком XPath 2.0. Более того, большинство конструкций языка XPath 2.0 созданы в расчете на написание запросов. Многие выражения XPath, такие как выражение //ААА/ВВВ, делают запрос на поиск информации в документе XML. Поэтому язык XQuery можно считать расширением язык XPath 2.0. В нем можно применять почти все, что есть в языке XPath 2.0.

    Единственное ограничение - в первой версии языка XQuery, выражения, определяющие путь, можно направлять только по 6 осям из 13, имеющихся в языке XPath: child (по умолчанию), descendant, attribute, self, descendant-or-self и parent.

    Основной единицей языка XQuery, как и языка XPath, служит выражение, причем набор выражений, перечисленных через запятую, тоже считается выражением. Это так называемая "операция запятая", объединяющая несколько выражений в одно, вычисляемое последовательно слева направо. Результат вычисления выражения, как и в языке XPath, - последовательность узлов и/или атомарных значений. Виды узлов и типы атомарных значений таковы же, как и в XPath 2.0.

    Запрос в языке XQuery тоже оформляется как выражение. Разница заключается в том, что и результате вычисления выражения получается последовательность, а в результате выполнения запроса должен получиться один или несколько документов XML. Значит, в первую очередь язык XQuery должен научиться конструировать элементы XML. За это отвечают конструкторы.

    Конструкторы

    Конструктор узлов - это выражение, которое создает и добавляет к дереву документа новые узлы.

    Конструкторы могут создавать узлы каждого вида за исключением узлов пространств имен. При этом узел-элемент можно создать средствами прямого или вычисляемого конструктора, узел-атрибут, корневой узел документа и текстовый узел - только вычисляемого конструктора, а узлы-комментарии и узлы инструкций по обработке просто записываются в конструкторе прямо в том виде, в каком они затем появятся в документе.

    Прямой конструктор элемента

    Самый простой способ сконструировать элемент XML- это записать его в явном виде с открывающим тегом, атрибутами, содержимым и закрывающим тегом. Эта форма называется прямым конструктором элемента.

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

    <аgе>{10 + 20 }</аgе>

    Заметьте, что если не написать фигурные скобки, то выражение не будет вычисляться, а попадет в конструируемый элемент как простой текст.

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

    В общем случае прямой конструктор элемента состоит из элемента XML. В элемент могут быть вложены другие элементы, выражения в фигурных скобках и наборы символов - содержимое элемента. Конструктор преобразует наборы символов в текстовые узлы, вычисляет выражения, рекурсивно обрабатывает вложенные элементы и формирует новый узел-элемент с вложенными узлами-элементами, узлами-атрибутами и текстовыми узлами.

    Каждое выражение после вычисления даст последовательность узлов и/или атомарных значений. Для узлов из этой последовательности конструктор создаст точную копию со всеми их узлами-потомками, узлами-атрибутами, углами пространств имен, если они есть. Для каждой подпоследовательности идущих подряд атомарных значений конструктор создаст один текстовый узел, содержащий строковые представления атомарных значений с пробелом между ними.

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

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

    После этого прямой конструктор создает узел-элемент с узлами-потомками из последовательности, полученной на предыдущем шаге.

    В атрибутах конструктора тоже можно записать выражения в фигурных скобках, например:

    <person id="92-3456" sex="{ /notion/sex[1]}">

    Выражение вычисляется, каждый элемент полученной последовательности представляется строкой, а строки разделяются пробелами. Кроме выражений, значение атрибута может содержать наборы символов, которые сцепляются со строками, полученными из выражений, без всяких пробелов:

    <person id="9{l + 1}-3456" sex="male">

    Вычисляемый конструктор

    Прямой конструктор использует заданные заранее имена элементов и атрибутов. Иногда это неудобно или невозможно сделать. В таких случаях применяют вычисляемые конструкторы.

    Вычисляемые конструкторы могут создавать узлы четырех видов: узлы-элементы, узлы-атрибуты, корневые узлы документа или текстовые узлы. Поэтому в начале конструктора надо указать вид создаваемого узла одним из слов element, attribute, document или text. После этого слова в фигурных скобках записывается выражение, конструирующее узел. Для узла-элемента и узла-атрибута нужно еще записать его имя, которое тоже можно задать выражением.

    Вернуться к учебному плану