Для того чтобы язык XML мог полностью задействовать свой потенциал, необходимо иметь способ реализации ссылок между документами XML, указатели на них и запросы к ним.
В связи с тем, что в документах XML сохраняется все 6ольше информации, возникает необходимость в разработке способа получения структурированного доступа к этой информации. Также необходимы способ определения связей между частями документов и обращения к фрагментам (или ресурсам) внутри документов, которые связаны с другими ресурсами. Эти ресурсы могут быть фрагментами как того же, так и других документов, или вовсе не относиться к формату XML.
Проект 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, это допустимо).
Информационные пункты символов содержат свойства:
false.Для каждого комментария в документе можно определить один информационный пункт комментария.
Информационный пункт комментария содержит свойство - содержание этого комментария.
Один информационный пункт декларации типа документа можно указать при желании разработчика и при наличии такой декларации.
У информационного пункта декларации типа документа могут быть следующие свойства:
DTD.DTD.Не анализируемые
Информационные пункты сущностей содержат такие свойства:
DTD ).DTD.URI сущности. Если сущность является внутренней, то значение этого идентификатора должно быть равно nullДля каждой объявленной в определении DTD нотации должен быть один информационный пункт нотации.
Информационные пункты нотации содержат следующие свойства:
URI, соответствующий нотацииДля того чтобы отметить начало текста, вставляемого из внешней анализируемой сущности, имеется маркер начала сущности. Маркер не используется для параметрических сущностей.
Информационный пункт маркера начала сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.
Для того чтобы отметить конец текста, вставляемого из внешней анализируемой сущности, существует маркер конца сущности. Маркер не используется для параметрических сущностей.
Информационный пункт маркера конца сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.
Для того чтобы показать начало текста, включенного в раздел DATA, используется один маркер начала объекта. Информационный пункт маркера начала раздела CDATA не имеет свойств.
Для того чтобы показать конец текста, включенного в раздел CDATA, используется один маркер конца сущности. Информационный пункт маркера конца раздела CDATA не имеет свойств.
Для каждого пространства имен существует одна декларация пространства имен, она объявляется (или подразумевается) как атрибут элемента.
Информационный пункт декларации пространства имен имеет следующие свойства:
URI объявляемого пространства имен. Необходимо сообщить либо это свойство, либо следующее далее свойство потомка (описывающее текст), либо то и другое.W3C добавил это свойство, чтобы обеспечить возможность определять пространства имен в будущих версиях не по URI.Все эти информационные пункты и свойства практически идентичны модели DOM. Фактически все различные технологии, определенные консорциумом W3C для доступа к документам XML - XML DOM, XLink, XPath, XPointer, а также XSLT - являются производными от базовой структуры, описанной в спецификации XML Information Set. Чтобы извлечь максимум из предоставляемых этими технологиями функциональных возможностей, необходимо рассматривать документы XML не как потоки текстовой информации, а именно как описанные ранее объекты.
Несмотря на то, что стандарт подробно описывает соединения между объектами, он не определяет какой-либо конкретной реализации.
Чтобы использовать различные технологии, определенные консорциумом W3C для доступа к документам XML и манипулирования ими, сначала необходимо изучить определения консорциума W3C в спецификации Infoset. Как только вы перестанете считать документы XML текстом и начнете думать о них как о связанных информационных пунктах, вы обнаружите, что механизмы связывания и запросов для доступа к документам XML становятся очень естественными и интуитивными. В этих технологиях используются пункты информационного набора, описанные в стандарте Infoset ; они позволяют манипулировать документами XML и адресовать их, используя представленные в пунктах связи типа "родитель-потомок" для навигации по этим документам.
Язык 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 предлагает другой, более удобный выход из этой ситуации. Мы выносим все ссылки в отдельный файл - "банк ссылок" - и в случае необходимости изменяем ссылки только в этом файле. Все документы, которым нужны ссылки, обращаются за ними в банк ссылок.
Язык 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, которые можно объявить в любом элементе.
Ссылки на помеченные элементы указываются атрибутами типа или , которые тоже можно объявить в любом элементе. Проверяющий анализатор, просматривая документ XML, следит за соответствием меток и ссылок на них, отмечая как ошибку ссылку на несуществующую метку. Знак решетки # в ссылках записывать не нужно, сам тип показывает, что значение атрибута - ссылка.
Предыдущий пример, переписанный по правилам 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 получило новое значение. Это запись вида
element (color/3)
похожая на запись функции и состоящая из имени схемы и данных, записанных в скобках.
Схемы, записанные в указателе, просматриваются последовательно до тех пор, пока не будет найдена точка в документе, отвечающая какой-либо схеме. После этого просмотр указателя прекращается, оставшиеся схемы не рассматриваются. В приведенном выше примере, если будет найден элемент section, то схема element (color/3) рассматриваться уже не будет.
Имя схемы - это уточненное имя типа Qname, состоящее из необязательного префикса, связанного с идентификатором пространства имен, и локальной части, отделенной от префикса двоеточием.
Имена без префиксов зарезервированы за схемами, которые определяются в рекомендациях консорциума W3C. Каждая схема, предложенная консорциумом, описывается отдельной рекомендацией. Разработчики могут вводить свои схемы, снабжая их имена префиксами.
Смысл и правила записи данных зависят от вида схемы. Есть только одно общее правило, вытекающее из того, что данные записываются в скобках - все скобки, относящиеся к данным, должны быть парными или предваряться символом "каре" ("крышечкой"): xxx^(yyy или yyy^)xxx. Если же в данных встречается символ каре, то его следует удваивать: xxx^^yyy.
Разумеется, схема- это не функция, она ничего не вычисляет и не выдает никакого результата. Это просто форма записи, несколько неожиданная и непривычная для языков, основанных на XML.
Схема element() реализует потребность ссылаться на элемент документа XML примерно в таком стиле: "сослаться на второй абзац третьего параграфа договора №5". Реализация очень проста и выглядит следующим образом:
element(/1/3/2)
В этом примере начальная наклонная черта и единица показывают, что отсчет начинается с корневого элемент. В нем выбирается третий по счету непосредственно вложенный элемент. В этом элементе выбирается второй по счету вложенный в него элемент.
Запись вида /1/3/2 называется последовательностью вложений. Она напоминает запись пути к файлу. Наклонная черта отмечает вложенный элемент подобно 1.
Поскольку в хорошо оформленном документе XML может быть только один корневой элемент, последовательность вложений обычно начинается с наклонной черты и единицы: /l. За следующей наклонной чертой перечисляются элементы, непосредственно вложенные в корневой элемент и т. д.
Перед последовательностью вложений может стоять простой указатель. В этом случае вложения отсчитываются не от корневого элемента, а от элемента, помеченного этим указателем. Применяя простой указатель, предыдущий пример можно записать так:
element (sect3a/2)
Наконец, данные в схеме element () могут состоять только из простого указателя:
element (sect3a)
Это эквивалентно написанию простого указателя без всякой схемы.
Схема xpointer() использует для создания указателей и ссылок на них мощные средства адресации элементов и других частей документа, предоставляемые языком XPath. В схеме xpointer() данными, записываемыми в скобках, могут служить любые выражения, допускаемые в языке XPath, а также их расширения, введенные в язык XPointer.
Язык XPath рассматривает документ XML как дерево. Корнем дерева будет корневой элемент документа, а узлами - вложенные элементы, содержимое элемента (текстовый узел) или его атрибуты. Кроме того, в узлах дерева могут находиться комментарии, инструкции по обработке, пространства имен.
Схема element() не учитывает текстовые узлы и узлы-атрибуты. Она отмечает только вложенные элементы. Но схема xpointer() должна строго следовать правилам языка XPath и учитывать текстовые узлы, даже если они содержат только пробельные символы. Впрочем, многие программы-анализаторы языка XPointer не следуют этому правилу. Например, функция last() разными программами-анализаторами будет вычислена по-разному в зависимости от того, как они построят
Исторически сложилось так, что язык XPath был создан на два года раньше языка XPoinler. Поэтому создатели языка XPointer внесли в него дополнения, расширившие конструкции языка XPath.
Во-первых, кроме узлов дерева, язык XPointer рассматривает точки (points) и области (ranges).
Точкой язык XPointer называет позицию между символами документа XML.
Область занимает пространство между двумя точками: начальной точкой и конечной точкой. Начальная и конечная точки могут располагаться в любом месте документа XML, следовательно, область может пересекать элементы документа XML, не совпадая с узлами дерева. Разумеется, начальная точка должна встретиться в документе раньше конечной точки.
Точки, области и узлы вместе образуют местоположение. В результате всякого поиска отыскивается некоторое местоположение или набор местоположений.
Во-вторых, в схему xpointer() введены новые функции range(), stringrange(), range-to(), range-inside (), here(), origin (), start-point(), end-point(), работающие с точками и областями.
Эти дополнения позволяют гораздо точнее адресовать различные части документа, вплоть до отдельного символа.
Все действия с точками и областями выполняются с помощью перечисленных функций.
Для удобной работы с документом XML необходимы средства, позволяющие точно адресовать ту или иную его часть: отдельную точку, множество точек, какой-либо участок или множество участков документа. Такие средства предоставляет язык XPath, разработанный консорциумом W3C. Язык XPath, как и XPointer, - не реализация XML. Его основу составляют выражения различных типов, в числе которых логический, числовой и строковый тип. В выражениях записываются константы, переменные и функции, входящие в состав XPath. Они связываются операциями, характерными для данного типа. В результате вычисления выражения получается указание на какой-то один или сразу несколько участков документа.
Очень часто выражение строится подобно пути к файлу в файловой системе, откуда и происходит название языка "XML Path", сокращенно XPath. При этом документ XML рассматривается как дерево.
Язык XPath представляет документ в виде дерева, корнем которого служит корневой элемент документа. От корня отходят ветви, заканчивающиеся узлами. Узлами служат, например, вложенные элементы, их атрибуты и тексты, составляющие содержимое корневого элемента. От каждого вложенного элемента отходят свои ветви, рекурсивно повторяющие ветви корневого элемента. Таким образом, у каждого узла может быть только один узел - "предок", причем предком может быть только узел корневого или другого элемента дерева, но не атрибут и не текстовый узел.
Язык XPath различает семь видов узлов.
XPath предусмотрена возможность работы с другими типами документов, возможно, содержащими несколько корневых элементов. Имя узла документа совпадает с именем корневого элемента документа.<?xml version="1.0"?>не считается инструкцией по обработке и не входит в
Узел любого вида можно представить строкой символов. Для каждого вида узла правила представления свои, они перечислены далее.
URI.Чаще всего выражение языка XPath показывает путь к определяемому участку документа XML, начинающийся в корневом узле документа или каком-то начальном узле. Такие выражения состоят из нескольких шагов поиска, выполняемых последовательно слева направо. Последовательность, полученная на предыдущем шаге, передается следующему шагу, который использует ее как исходный материал для поиска. Шаги в выражении разделены наклонными чертами. Например, выражение
/contract/section/paragraph
состоит из трех шагов поиска, содержащих имена элементов , section и paragraph. В результате вычисления первого шага этого выражения получится последовательность узлов, вложенных в узел документа . На втором шаге из этой последовательности выбираются узлы section, на третьем - узлы paragraph. В результате вычисления всего выражения получается последовательность узлов, состоящая из всех элементов paragraph, вложенных в элементы section, которые, в свою очередь, вложены в элементы .
В общем случае шаг поиска устроен гораздо сложнее. Язык XPath 2.0 различает два вида шагов поиска: шаг, направляемый осью поиска, и шаг, направляемый фильтром. После выполнения шага, направляемого осью, получается последовательность узлов, а после выполнения фильтра в последовательности кроме узлов могут встретиться атомарные значения.
Шаг, направляемый осью поиска, состоит из трех частей: оси поиска, теста узла и необязательного предиката. Ось отделяется от теста узла двумя двоеточиями, а предикат записывается после теста узла в квадратных скобках:
ось: текст узла [предикат].
Например, шаг поиска может выглядеть так:
child::section[l]
В этом примере ось поиска child показывает, что поиск охватывает все узлы, непосредственно вложенные в просматриваемый узел, за исключением узлов-атрибутов и узлов пространств имен, текст узла section выбирает из этих узлов узлы-элементы section, а предикат 1 выбирает первый из встреченных узлов-элементов section.
Каждая из трех частей шага поиска сужает первоначальную область поиска.
Ось поиска задает направление поиска, отсчитываемое от текущего узла, и его объем. Например, поиск может идти в сторону вложенных элементов или, наоборот, просматривать родительские узлы. Можно просматривать только атрибуты элементов или только соседние элементы.
Текст узла выбирает в области поиска, заданной осью, определенные узлы по их имени или типу.
Предикат содержит условия, по которым проверяет узлы, уже отобранные осью поиска и тестом узла, и делает окончательный выбор.
Шаг, направляемый фильтром, использует вместо оси и теста узла
xs:integer, xs:decimal, xs:double ;xs:string ;Поэтому на шаге, направляемом фильтром, можно применять любое выражение, надо только заключить его в скобки.
После того как язык 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.
Проект 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, это допустимо).
Информационные пункты символов содержат свойства:
false.Для каждого комментария в документе можно определить один информационный пункт комментария.
Информационный пункт комментария содержит свойство - содержание этого комментария.
Один информационный пункт декларации типа документа можно указать при желании разработчика и при наличии такой декларации.
У информационного пункта декларации типа документа могут быть следующие свойства:
DTD.DTD.Не анализируемые
Информационные пункты сущностей содержат такие свойства:
DTD ).DTD.URI сущности. Если сущность является внутренней, то значение этого идентификатора должно быть равно nullДля каждой объявленной в определении DTD нотации должен быть один информационный пункт нотации.
Информационные пункты нотации содержат следующие свойства:
URI, соответствующий нотацииДля того чтобы отметить начало текста, вставляемого из внешней анализируемой сущности, имеется маркер начала сущности. Маркер не используется для параметрических сущностей.
Информационный пункт маркера начала сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.
Для того чтобы отметить конец текста, вставляемого из внешней анализируемой сущности, существует маркер конца сущности. Маркер не используется для параметрических сущностей.
Информационный пункт маркера конца сущности содержит свойство, представляющее собой ссылку на информационный пункт сущности для вставляемого текста.
Для того чтобы показать начало текста, включенного в раздел DATA, используется один маркер начала объекта. Информационный пункт маркера начала раздела CDATA не имеет свойств.
Для того чтобы показать конец текста, включенного в раздел CDATA, используется один маркер конца сущности. Информационный пункт маркера конца раздела CDATA не имеет свойств.
Для каждого пространства имен существует одна декларация пространства имен, она объявляется (или подразумевается) как атрибут элемента.
Информационный пункт декларации пространства имен имеет следующие свойства:
URI объявляемого пространства имен. Необходимо сообщить либо это свойство, либо следующее далее свойство потомка (описывающее текст), либо то и другое.W3C добавил это свойство, чтобы обеспечить возможность определять пространства имен в будущих версиях не по URI.Все эти информационные пункты и свойства практически идентичны модели DOM. Фактически все различные технологии, определенные консорциумом W3C для доступа к документам XML - XML DOM, XLink, XPath, XPointer, а также XSLT - являются производными от базовой структуры, описанной в спецификации XML Information Set. Чтобы извлечь максимум из предоставляемых этими технологиями функциональных возможностей, необходимо рассматривать документы XML не как потоки текстовой информации, а именно как описанные ранее объекты.
Несмотря на то, что стандарт подробно описывает соединения между объектами, он не определяет какой-либо конкретной реализации.
Чтобы использовать различные технологии, определенные консорциумом W3C для доступа к документам XML и манипулирования ими, сначала необходимо изучить определения консорциума W3C в спецификации Infoset. Как только вы перестанете считать документы XML текстом и начнете думать о них как о связанных информационных пунктах, вы обнаружите, что механизмы связывания и запросов для доступа к документам XML становятся очень естественными и интуитивными. В этих технологиях используются пункты информационного набора, описанные в стандарте Infoset ; они позволяют манипулировать документами XML и адресовать их, используя представленные в пунктах связи типа "родитель-потомок" для навигации по этим документам.
Язык 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 предлагает другой, более удобный выход из этой ситуации. Мы выносим все ссылки в отдельный файл - "банк ссылок" - и в случае необходимости изменяем ссылки только в этом файле. Все документы, которым нужны ссылки, обращаются за ними в банк ссылок.
Язык 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, которые можно объявить в любом элементе.
Ссылки на помеченные элементы указываются атрибутами типа или , которые тоже можно объявить в любом элементе. Проверяющий анализатор, просматривая документ XML, следит за соответствием меток и ссылок на них, отмечая как ошибку ссылку на несуществующую метку. Знак решетки # в ссылках записывать не нужно, сам тип показывает, что значение атрибута - ссылка.
Предыдущий пример, переписанный по правилам 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 получило новое значение. Это запись вида
element (color/3)
похожая на запись функции и состоящая из имени схемы и данных, записанных в скобках.
Схемы, записанные в указателе, просматриваются последовательно до тех пор, пока не будет найдена точка в документе, отвечающая какой-либо схеме. После этого просмотр указателя прекращается, оставшиеся схемы не рассматриваются. В приведенном выше примере, если будет найден элемент section, то схема element (color/3) рассматриваться уже не будет.
Имя схемы - это уточненное имя типа Qname, состоящее из необязательного префикса, связанного с идентификатором пространства имен, и локальной части, отделенной от префикса двоеточием.
Имена без префиксов зарезервированы за схемами, которые определяются в рекомендациях консорциума W3C. Каждая схема, предложенная консорциумом, описывается отдельной рекомендацией. Разработчики могут вводить свои схемы, снабжая их имена префиксами.
Смысл и правила записи данных зависят от вида схемы. Есть только одно общее правило, вытекающее из того, что данные записываются в скобках - все скобки, относящиеся к данным, должны быть парными или предваряться символом "каре" ("крышечкой"): xxx^(yyy или yyy^)xxx. Если же в данных встречается символ каре, то его следует удваивать: xxx^^yyy.
Разумеется, схема- это не функция, она ничего не вычисляет и не выдает никакого результата. Это просто форма записи, несколько неожиданная и непривычная для языков, основанных на XML.
Схема element() реализует потребность ссылаться на элемент документа XML примерно в таком стиле: "сослаться на второй абзац третьего параграфа договора №5". Реализация очень проста и выглядит следующим образом:
element(/1/3/2)
В этом примере начальная наклонная черта и единица показывают, что отсчет начинается с корневого элемент. В нем выбирается третий по счету непосредственно вложенный элемент. В этом элементе выбирается второй по счету вложенный в него элемент.
Запись вида /1/3/2 называется последовательностью вложений. Она напоминает запись пути к файлу. Наклонная черта отмечает вложенный элемент подобно 1.
Поскольку в хорошо оформленном документе XML может быть только один корневой элемент, последовательность вложений обычно начинается с наклонной черты и единицы: /l. За следующей наклонной чертой перечисляются элементы, непосредственно вложенные в корневой элемент и т. д.
Перед последовательностью вложений может стоять простой указатель. В этом случае вложения отсчитываются не от корневого элемента, а от элемента, помеченного этим указателем. Применяя простой указатель, предыдущий пример можно записать так:
element (sect3a/2)
Наконец, данные в схеме element () могут состоять только из простого указателя:
element (sect3a)
Это эквивалентно написанию простого указателя без всякой схемы.
Схема xpointer() использует для создания указателей и ссылок на них мощные средства адресации элементов и других частей документа, предоставляемые языком XPath. В схеме xpointer() данными, записываемыми в скобках, могут служить любые выражения, допускаемые в языке XPath, а также их расширения, введенные в язык XPointer.
Язык XPath рассматривает документ XML как дерево. Корнем дерева будет корневой элемент документа, а узлами - вложенные элементы, содержимое элемента (текстовый узел) или его атрибуты. Кроме того, в узлах дерева могут находиться комментарии, инструкции по обработке, пространства имен.
Схема element() не учитывает текстовые узлы и узлы-атрибуты. Она отмечает только вложенные элементы. Но схема xpointer() должна строго следовать правилам языка XPath и учитывать текстовые узлы, даже если они содержат только пробельные символы. Впрочем, многие программы-анализаторы языка XPointer не следуют этому правилу. Например, функция last() разными программами-анализаторами будет вычислена по-разному в зависимости от того, как они построят
Исторически сложилось так, что язык XPath был создан на два года раньше языка XPoinler. Поэтому создатели языка XPointer внесли в него дополнения, расширившие конструкции языка XPath.
Во-первых, кроме узлов дерева, язык XPointer рассматривает точки (points) и области (ranges).
Точкой язык XPointer называет позицию между символами документа XML.
Область занимает пространство между двумя точками: начальной точкой и конечной точкой. Начальная и конечная точки могут располагаться в любом месте документа XML, следовательно, область может пересекать элементы документа XML, не совпадая с узлами дерева. Разумеется, начальная точка должна встретиться в документе раньше конечной точки.
Точки, области и узлы вместе образуют местоположение. В результате всякого поиска отыскивается некоторое местоположение или набор местоположений.
Во-вторых, в схему xpointer() введены новые функции range(), stringrange(), range-to(), range-inside (), here(), origin (), start-point(), end-point(), работающие с точками и областями.
Эти дополнения позволяют гораздо точнее адресовать различные части документа, вплоть до отдельного символа.
Все действия с точками и областями выполняются с помощью перечисленных функций.
Для удобной работы с документом XML необходимы средства, позволяющие точно адресовать ту или иную его часть: отдельную точку, множество точек, какой-либо участок или множество участков документа. Такие средства предоставляет язык XPath, разработанный консорциумом W3C. Язык XPath, как и XPointer, - не реализация XML. Его основу составляют выражения различных типов, в числе которых логический, числовой и строковый тип. В выражениях записываются константы, переменные и функции, входящие в состав XPath. Они связываются операциями, характерными для данного типа. В результате вычисления выражения получается указание на какой-то один или сразу несколько участков документа.
Очень часто выражение строится подобно пути к файлу в файловой системе, откуда и происходит название языка "XML Path", сокращенно XPath. При этом документ XML рассматривается как дерево.
Язык XPath представляет документ в виде дерева, корнем которого служит корневой элемент документа. От корня отходят ветви, заканчивающиеся узлами. Узлами служат, например, вложенные элементы, их атрибуты и тексты, составляющие содержимое корневого элемента. От каждого вложенного элемента отходят свои ветви, рекурсивно повторяющие ветви корневого элемента. Таким образом, у каждого узла может быть только один узел - "предок", причем предком может быть только узел корневого или другого элемента дерева, но не атрибут и не текстовый узел.
Язык XPath различает семь видов узлов.
XPath предусмотрена возможность работы с другими типами документов, возможно, содержащими несколько корневых элементов. Имя узла документа совпадает с именем корневого элемента документа.<?xml version="1.0"?>не считается инструкцией по обработке и не входит в
Узел любого вида можно представить строкой символов. Для каждого вида узла правила представления свои, они перечислены далее.
URI.Чаще всего выражение языка XPath показывает путь к определяемому участку документа XML, начинающийся в корневом узле документа или каком-то начальном узле. Такие выражения состоят из нескольких шагов поиска, выполняемых последовательно слева направо. Последовательность, полученная на предыдущем шаге, передается следующему шагу, который использует ее как исходный материал для поиска. Шаги в выражении разделены наклонными чертами. Например, выражение
/contract/section/paragraph
состоит из трех шагов поиска, содержащих имена элементов , section и paragraph. В результате вычисления первого шага этого выражения получится последовательность узлов, вложенных в узел документа . На втором шаге из этой последовательности выбираются узлы section, на третьем - узлы paragraph. В результате вычисления всего выражения получается последовательность узлов, состоящая из всех элементов paragraph, вложенных в элементы section, которые, в свою очередь, вложены в элементы .
В общем случае шаг поиска устроен гораздо сложнее. Язык XPath 2.0 различает два вида шагов поиска: шаг, направляемый осью поиска, и шаг, направляемый фильтром. После выполнения шага, направляемого осью, получается последовательность узлов, а после выполнения фильтра в последовательности кроме узлов могут встретиться атомарные значения.
Шаг, направляемый осью поиска, состоит из трех частей: оси поиска, теста узла и необязательного предиката. Ось отделяется от теста узла двумя двоеточиями, а предикат записывается после теста узла в квадратных скобках:
ось: текст узла [предикат].
Например, шаг поиска может выглядеть так:
child::section[l]
В этом примере ось поиска child показывает, что поиск охватывает все узлы, непосредственно вложенные в просматриваемый узел, за исключением узлов-атрибутов и узлов пространств имен, текст узла section выбирает из этих узлов узлы-элементы section, а предикат 1 выбирает первый из встреченных узлов-элементов section.
Каждая из трех частей шага поиска сужает первоначальную область поиска.
Ось поиска задает направление поиска, отсчитываемое от текущего узла, и его объем. Например, поиск может идти в сторону вложенных элементов или, наоборот, просматривать родительские узлы. Можно просматривать только атрибуты элементов или только соседние элементы.
Текст узла выбирает в области поиска, заданной осью, определенные узлы по их имени или типу.
Предикат содержит условия, по которым проверяет узлы, уже отобранные осью поиска и тестом узла, и делает окончательный выбор.
Шаг, направляемый фильтром, использует вместо оси и теста узла
xs:integer, xs:decimal, xs:double ;xs:string ;Поэтому на шаге, направляемом фильтром, можно применять любое выражение, надо только заключить его в скобки.
После того как язык 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. После этого слова в фигурных скобках записывается выражение, конструирующее узел. Для узла-элемента и узла-атрибута нужно еще записать его имя, которое тоже можно задать выражением.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.