|
| ||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||
|
2006 г. XQuery 1.0 близок к завершениюЭндрю Эйзенберг (Andrew Eisenberg), Джим Мелтон (Jim Melton)
ВведениеXQuery – это язык запросов, разработанный для формулировки запросов к реальным и виртуальным XML-документам и коллекциям этих документов. Разработка этого языка началась во второй половине 1999 г. В декабре 2002 г. мы представили ранний вариант XQuery1. Сейчас приближается публикация XQuery 1.0 в виде рекомендации W3C (W3C Recommendation), и мы хотели бы осведомить вас о развитии языка. Теперь мы можем говорить об этой области даже более авторитетно, чем в прошлый раз, потому что в октябре 2004 г. оба стали сопредседателями Рабочей группы W3C по XML Query (W3C XML Query Working Group)2. Пол Коттон (Paul Cotton, Microsoft), который возглавлял группу с самого начала, в октябре отказался от этой роли. Его позиция в другом консорциуме не позволила ему остаться лидером группы XQuery 1.0 до момента его публикации в качестве рекомендации, хотя он определенно желал этого. Пол сыграл важную роль в процессе разработки XQuery, и его деятельность в качестве лидера группы заслуживает всяческих похвал. В этой статье мы концентрируемся на изменениях, которые претерпел XQuery со времени нашей прежней публикации. Если вы незнакомы с XQuery, то вам, может быть, стоит взглянуть на нашу предыдущую статью до продолжения чтения данной статьи*. Состояние XQueryВ ноябре 2005 г. кандидатами на рекомендацию (Candidate Recommendations, CR) стали следующие документы:
Над большинством этих документов рабочая группа по XML Query работает в тесном контакте с рабочей группой по XSL. Большинство документов было подвергнуто двойному рецензированию Last Call Working Draft (WD), а несколько из них прошло тройное рецензирование. На последней стадии рецензирования рабочие группы отреагировали почти на 600 комментариев. Назначение CR состоит в том, чтобы получить опыт реализации и обеспечить уверенность рабочей группы в том, что спецификация полна и однозначна. С этой целью рабочая группа по XML Query летом 2004 г. начала разработку тестового набора. Теперь XML Query Test Suite4 покрывает около 75% возможностей XQuery. Для завершения создания этого тестового набора и получения отчетов от реализаторов понадобится несколько месяцев. При наличии удачи и упорного труда со стороны ряда людей XQuery станет рекомендацией W3C до конца 2006 г. Модель данных XQuery 1.0 и XPath 2.0 (XDM)В дополнение к типам, определенным в документе XML Schema Part 25, в XDM определяются еще пять типов. Два из них обсуждались в нашей предыдущей статье:
Тип Тип Базовым типом типа СериализацияПосле публикации нашей предыдущей статьи рабочие группы создали новый документ: Сериализация XSLT 2.0 и XQuery 1.06. Материал этого документа был перемещен из спецификации XSLT 2.0, чтобы его можно было использовать и для XQuery 1.0. В этом документе определяются методы формирования выходных данных в форматах XML, XHTML, HTML и TEXT. В XQuery 1.0 используется только метод формирования выходных данных в формате XML, в то время как в XSLT используются все методы. Для сериализации может предоставляться значение модели данных XQuery 1.0 и XPath 2.0 (XDM). Сначала выполняется нормализация последовательности (Sequence Normalization), затем – генерация разметки, расширение символов и кодирование. Нормализация последовательности определяется в виде нескольких шагов, преобразующих экземпляр модели данных (data model instance) – последовательность значений и узлов – в единственный узел-документ. Атомарные значения приводятся к строкам и затем к текстовым узлам. Узлы-документы отбрасываются, но их дети сохраняются. Ошибкой сериализации является помещение в результирующий документ узла-атрибута, который не является ребенком некоторого узла-элемента. В сериализации определяется ряд параметров, которые влияют на производимый результат. Например, значением Метод вывода в формате XML генерирует правильно построенную сущность XML-документа (well-formed XML document entity), если результат нормализации последовательности – это узел-документ с единственным ребенком, являющимся узлом-элементом, и без детей, которые представляют собой текстовые узлы. В противном случае генерируется правильно построенная, внешняя, обобщенная, анализируемая XML-сущность (well-formed XML external general parsed entity). В спецификации не говорится, как следует формировать эти сущности. Требуется только, чтобы при синтаксическом разборе результата и при генерации экземпляра модели данных с использованием результирующего информационного набора (infoset) получался один и тот же экземпляр модели данных. Более точно, эти экземпляры могут различаться, например, порядком узлов. В течение сериализации не предпринимаются какие-либо попытки сохранения аннотаций типов. Если результат валидируется на соответствие XML Schema, то создаются новые аннотации типов. XQueryXQuery 1.0 является почти строгим надмножеством XPath 2.0 – в XQuery 1.0 не используются узлы-пространства имен XPath и не поддерживаются оси пространства имен XPath. Входные данные для обработки XQueryСущности модели данных, с которыми может оперировать XQuery, могут предоставляться разными способами. В своей предыдущей статье мы описывали контекстный элемент (context item), обозначаемый через Введен вариант функции В реализации могут обеспечиваться переменные для использования в запросе. В запросе могут также определяться внешние переменные, значения которых должны поставляться основной средой. В объявлении переменной может содержаться ее тип. Если он не указывается, то основная среда обеспечивает тип переменной и ее значение. Следующий запрос может исполняться с использованием переменной declare variable $custName as xs:string
external;
fn:doc('orders.xml')
/orders/order[@cust=$custName]
...
<order id='444378' cust='Big Box'>
...
</order>
Шаги, возвращающие атомарные значенияВ XPath 1.0 результатом шага путевого выражения являлась последовательность узлов в порядке документа с удаленными дубликатами. В XQuery 1.0 и XPath 2.0 допускается, чтобы на завершающем шаге путевого выражения производилась последовательность атомарных значений. Запрос, возвращающий список названий городов и штатов для всех служащих в Калифорнии, можно написать как //employee[address/state='CA'] /address/concat(city, ', ', state) вместо for $a in //employee[address/state="CA"] /address return concat($a/city, ', ', $a/state) Объявления в прологе XQueryВ прологе XQuery теперь может содержаться большее число объявлений. Среди них объявление граничных пробелов (boundary-space declaration), объявление базового URI (base URI declaration), объявление конструирования (construction declaration), объявление копирования пространств имен (copy namespaces declaration) и объявление опций (option declaration). В этом разделе мы обсудим некоторые из этих объявлений. Граничные пробелыУ объявления declare boundary-space preserve; <test> <inner-element/> </test> У возвращаемого элемента имеются три ребенка: текстовый узел, содержащий несколько пробелов, узел-элемент и еще один текстовый узел. При указании КонструированиеУ объявления ОпцииОбъявление Рассмотрим расширение, позволяющее пользователю устанавливать значение тайм-аута в секундах, после истечения которого обработка запроса прекращается, и возвращается ошибка. declare namespace myxquery='...'; declare option myxquery:timeout '10'; for $e in //employees ... ВыраженияК набору выражений XQuery добавлены
Выражение
|
|
Последовательность из одного или более целых значений |
|
Последовательность из одного или более элементов |
|
Последовательность из одного или более узлов |
|
Один или несколько айтемов (узлов или атомарных значений) |
|
Атрибут (одиночный) с любым именем и типом |
|
Элемент с именем |
|
Элемент с любым именем и типом |
|
Элемент с именем |
Обозначение типа можно использовать следующим образом:
//employee [* instance of element (*, myco:addrType) ]
В ранних версиях XQuery допускались ссылки на элементы и атрибуты, локально объявленные в схеме, но эта возможность была исключена.
FLWR-выражение (for, let, where, return) стало FLWOR-выражением (где "O" обозначает "order by").
Каждый раздел order by может содержать несколько ключей сортировки, каждый из которых включает выражение и может включать указания, должна ли быть сортировка устойчивой, должна ли она производиться по возрастанию или же по убыванию, считается ли пустая последовательность большей или же меньшей любого айтема, и должна ли использоваться схема сортировки (collation sequence), отличная от схемы, применяемой по умолчанию.
Каждое выражение в разделе order by вычисляется для каждого связывания переменных в разделах for и let, которое не исключается разделом where. Если какое-либо выражение производит последовательность из более чем одного айтема, то возвращается ошибка. Все значения типа xdt:untypedAtomic приводятся к xs:string. Если для какого-либо ключа сортировки типы значений различаются (после подстановки подтипа и расширения типа), то возвращается ошибка. Следующий запрос возвращает данные о недавно нанятых служащих, упорядоченные сначала по длительности обучения, а затем по номерам отделов.
for $e in doc('employees.xml')//employee
where current-date() - $e/hireDate
< xdt:dayTimeDuration('P60D')
order by
$e/HSYears + $e/CollegeYears descending,
$e/dept empty greatest
return $e
Выбор того, считается ли пустая последовательность большей или меньшей любого айтема, может быть сделан в прологе запроса. В реализации XQuery любой из этих вариантов может быть принят по умолчанию.
В FLWOR-выражении также появился раздел at, который связывает позицию айтема в последовательности одновременно со связыванием значения этого айтема.
Следующий запрос возвращает данные о десяти служащих, работающих в компании дольше всех других служащих:
for $e at $p in (for $oe in //employee order by $oe/@hireDate descending return $oe) where $p <= 10 return $e
Было решено не поддерживать в XQuery узлы-пространства имен и ось пространств имен, поддерживаемые в XPath 1.0. Вместо этого, в XQuery с узлами ассоциируются связывания пространств имен в области действия (in-scope namespace bindings).
В XQuery также имеется набор статически известных пространств имен, используемых при разрешении квалифицированных имен (QName). В число этих статически известных пространств имен входят fn, xml, xs, xsi, xdt и local. В реализации могут быть добавлены собственные связывания пространств имен, и пользователь может добавить связывания в прологе запроса:
declare namespace
myco="http://www.example.com/myco";
<myco:result> { for ... } </myco:result>
Пространства имен в области действия могут влиять на сериализацию узлов-элементов, а также на поведение небольшого числа функций. С узлом, конструируемым в приведенном примере, ассоциируется одно связывание пространства имен. Пространство имен для myco берется из пространств имен, статически известных во время конструирования узла.
При конструировании узла его связывания пространств имен включают одно связывание, используемое в имени элемента; связывания в именах атрибутов; связывания, используемые в атрибутах объявления пространства имен; и связывания в объявлениях атрибутов пространств имен окружающих конструкторов элементов, которые не подвергнуты перезаписи.
Рассмотрим следующий пример:
import schema namespace hr="...";
validate strict {
<hr:employee>
<hr:skill xsi:type="xs:string">
unicycling
</hr:skill>
</hr:employee>
}
Этот запрос приведет к ошибке, потому что связывание для xs не появится в валидируемом информационном наборе. В XQuery не уделяется особое внимание атрибуту xsi:type. Значение "xs:string" – это всего лишь нетипизированное значение атрибута, оно не выглядит как QName, и поэтому xs не добавляется к пространствам имен в области действия. Это означает, что оно не является частью информационного набора. Данный запрос можно исправить путем изменения стартового тега следующим образом:
<hr:employee xmlns:xs ="http://www.w3.org/2001/XMLSchema"> . . . </hr:employee>
Более тонкое управление пространствами имен в области действия конструируемых элементов можно обеспечить с использованием объявления copy-namespaces в прологе запроса.
Библиотечный модуль – это коллекция переменных и функций в целевом пространстве имен, которая может импортироваться в запрос.
module namespace univ
="http://www.example.com/university";
declare function univ:gpa
($e as element (student)) as xs:decimal
{ for ... } ;
Эту функцию можно было бы вызвать в запросе следующим образом:
import module namespace univ ="http://www.example.com/university"; declare variable $id external; univ:gpa(//student[id=$id])
XQueryX9 определяет XML-представление XQuery. В этой спецификации определяется структура элементов, отражающая абстрактный синтаксис XQuery. Определение XQueryX немного изменилось со времени нашей предыдущей статьи. В Примере 1 содержится простой XQuery-запрос и соответствующее XQueryX-представление.
Хотя XQueryX труднее читается и пишется людьми, у него имеется несколько полезных свойств. XQueryX-представления легко генерируются инструментальными средствами и многослойными приложениями, и они легко встраиваются в более крупные XML-документы, позволяя формулировать «запросы над запросами».
Конечно, все изменения, которым подвергся XQuery, в равной степени относятся и к XQueryX. Но в XQueryX имеется еще одно достаточно важное изменение. Во время нашей предыдущей публикации XML Schema, определяющая синтаксис XQueryX, основывалась на иерархии типов, которую оказалось трудно поддерживать при добавлении к языку новых возможностей, а также несколько затруднительно держать в голове человека. Эта иерархическая организация было заменена другой, основанной на группах подстановок XML Schema. Такой подход поддается более простому расширению при появлении новых языковых возможностей и более близок знатокам Schema.
for $b in .//book return $b/title <xqx:module xmlns:xqx="http://www.w3.org/2005/XQueryX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <xqx:mainModule> <xqx:queryBody> <xqx:flworExpr> <xqx:forClause> <xqx:forClauseItem> <xqx:typedVariableBinding> <xqx:varName>b</xqx:varName> </xqx:typedVariableBinding> <xqx:forExpr> <xqx:pathExpr> <xqx:argExpr> <xqx:contextItemExpr/> </xqx:argExpr> <xqx:stepExpr> <xqx:xpathAxis> descendant-or-self </xqx:xpathAxis> <xqx:anyKindTest/> </xqx:stepExpr> <xqx:stepExpr> <xqx:xpathAxis>child</xqx:xpathAxis> <xqx:nameTest>book</xqx:nameTest> </xqx:stepExpr> </xqx:pathExpr> </xqx:forExpr> </xqx:forClauseItem> </xqx:forClause> <xqx:returnClause> . . . </xqx:returnClause> </xqx:flworExpr> </xqx:queryBody> </xqx:mainModule> </xqx:module>
Пример 1. XQuery-запрос и его эквивалентное XQueryX-представление
Несколько небольших изменений было внесено также в схему XQueryX. Наиболее существенным изменением является новый элемент схемы <xqx:xquery>, используемый для тривиального встраивания текста XQuery (в читаемом человеком виде) в XML-документы.
И для XQuery, и для XQueryX имеются декларации о соответствии, определяющие минимальное соответствие (Minimal Conformance) и набор необязательных возможностей.
Минимальная согласованность является самым низким уровнем согласованности, который может провозглашаться для XQuery. Минимальная согласованность охватывает все функциональные возможности XQuery за исключением следующих необязательных средств:
import schema в прологе для обеспечения осведомленности XQuery об объявлениях элементов, атрибутов и типов.
validate.
ancestor, ancestor-or-self, following, following-sibling, preceding и preceding-sibling.
import module в прологе, и позволяет создавать библиотечные модули.
<xqx:xquery>for $e in ... </xqx:xquery>.Продолжая продвигать XQuery к его публикации в качестве рекомендации W3C, мы ведем разработку средств, которые будут добавлены к XQuery 1.0.
Опубликовано несколько рабочих проектов (Working Drafts, WD) XQuery 1.0 and Path 2.0 Full-Text7. Опубликованы требования к XQuery Update Facility8, но исходный WD еще не опубликован.
Мы ожидаем, что в начале следующего года Рабочая группа по XQuery начнет анализировать средства, которые нельзя было включить в XQuery 1.0, на предмет включения в следующую версию рекомендаций.
1 An Early Look at XQuery, Andrew Eisenberg and Jim Melton, ACM SIGMOD Record, Vol. 31, No. 4, December 2002
3 W3C Technical Reports and Publications
5 XML Schema Part 2: Datatypes Second Edition, Paul V. Biron and Ashok Malhotra, Oct. 28, 2004
6 XSLT 2.0 and XQuery 1.0 Serialization, Michael Kay, et al, Nov. 3, 2005
7 XQuery 1.0 and XPath 2.0 Full-Text, Sihem Amer-Yahia, et al, Nov. 3, 2005
8 XQuery Update Facility Requirements, Don Chamberlin and Jonathan Robie, June 3, 2005
9 XML Syntax for XQuery1.0, Jim Melton and Subramanian Muralidhar, Nov. 3, 2005
Примечание
* Перевод на русский язык этой статьи отсутствует, но если для вас затруднительно чтение оригинала, взамен вы может прочитать материалы на CITForum здесь и здесь. Примечание переводчика.
|
CITForum © 1997–2025