XQuery ( XML Query ) — это язык запросов и функционального программирования , который запрашивает и преобразует коллекции структурированных и неструктурированных данных , обычно в форме XML , текста и с расширениями, специфичными для поставщика, для других форматов данных ( JSON , двоичный и т. д.). Язык разработан рабочей группой XML Query W3C . Работа тесно координируется с разработкой XSLT рабочей группой XSL ; обе группы разделяют ответственность за XPath , который является подмножеством XQuery.
XQuery 1.0 стал рекомендацией W3C 23 января 2007 года. [4]
XQuery 3.0 стал рекомендацией W3C 8 апреля 2014 года. [5]
XQuery 3.1 стал рекомендацией W3C 21 марта 2017 года. [6]
«Миссия проекта XML Query заключается в предоставлении гибких возможностей запросов для извлечения данных из реальных и виртуальных документов во Всемирной паутине, тем самым, в конечном итоге, обеспечивая необходимое взаимодействие между миром Веб и миром баз данных. В конечном итоге, к коллекциям XML-файлов будет осуществляться доступ как к базам данных». [7]
XQuery — это функциональный, свободный от побочных эффектов , ориентированный на выражения язык программирования с простой системой типов , который Килпеляйнен описал следующим образом: [8]
Все выражения XQuery работают с последовательностями и оцениваются как последовательности. Последовательности — это упорядоченные списки элементов. Элементы могут быть либо узлами , которые представляют компоненты XML-документов, либо атомарными значениями , которые являются экземплярами базовых типов XML-схемы, таких как xs:integer или xs:string . Последовательности также могут быть пустыми или состоять только из одного элемента. Различия между одним элементом и одноэлементной последовательностью не делается. (...) Последовательности XQuery/XPath отличаются от списков в таких языках, как Lisp и Prolog, тем, что исключают вложенные последовательности. Разработчики XQuery могли посчитать вложенные последовательности ненужными для манипуляции содержимым документа. Вложенность или иерархия структур документа вместо этого представлена узлами и их отношениями дочерний-родительский
XQuery предоставляет средства для извлечения и обработки данных из XML-документов или любых источников данных, которые можно рассматривать как XML, например, реляционных баз данных [9] или офисных документов.
XQuery содержит надмножество синтаксиса выражений XPath для обращения к определенным частям документа XML. Он дополняет его SQL -подобным " выражением FLWOR " для выполнения соединений. Выражение FLWOR состоит из пяти предложений, в честь которых оно и названо: FOR, LET, WHERE, ORDER BY, RETURN.
Язык также предоставляет синтаксис, позволяющий создавать новые XML-документы. Если имена элементов и атрибутов известны заранее, можно использовать синтаксис, подобный XML; в других случаях доступны выражения, называемые динамическими конструкторами узлов. Все эти конструкции определяются как выражения внутри языка и могут быть произвольно вложенными.
Язык основан на модели данных XQuery и XPath (XDM), которая использует древовидную модель информационного содержимого XML-документа, содержащую семь видов узлов: узлы документа, элементы, атрибуты, текстовые узлы, комментарии, инструкции по обработке и пространства имен.
XDM также моделирует все значения как последовательности (синглтонное значение считается последовательностью длины один). Элементы в последовательности могут быть либо узлами XML, либо атомарными значениями. Атомарные значения могут быть целыми числами, строками, булевыми значениями и т. д.: полный список типов основан на примитивных типах, определенных в XML Schema .
Функции обновления XML-документов или баз данных, а также возможность полнотекстового поиска не являются частью основного языка, но определены в дополнительных стандартах расширений: XQuery Update Facility 1.0 поддерживает функцию обновления, а XQuery и XPath Full Text 1.0 поддерживают полнотекстовый поиск в XML-документах.
XQuery 3.0 добавляет поддержку полного функционального программирования, поскольку функции представляют собой значения, которыми можно манипулировать (хранить в переменных, передавать в функции более высокого порядка и динамически вызывать).
В примере кода XQuery ниже перечислены уникальные говорящие в каждом акте пьесы Шекспира «Гамлет», закодированные в hamlet.xml.
<html><body> { for $ act in doc ( "hamlet.xml" )// ACT let $ speaker := distinct-values ( $ act // SPEAKER ) return <div> <h1> { string ( $ act / TITLE ) } </h1> <ul> { for $ speaker in $ speaker return <li> { $ speaker } </li> } </ul> </div> } </body></html>
Все конструкции XQuery для выполнения вычислений являются выражениями . Операторы отсутствуют , хотя некоторые ключевые слова, по-видимому, предполагают поведение, подобное операторам. Для выполнения функции выражение внутри тела вычисляется, и его значение возвращается. Таким образом, чтобы написать функцию для удвоения входного значения, нужно просто написать:
объявить функцию local:doubler ( $ x ) { $ x * 2 }
Чтобы написать полный запрос «Hello World», нужно написать выражение:
"Привет, мир"
Этот стиль распространен в языках функционального программирования .
Ниже приведено несколько примеров использования XQuery:
Хотя XQuery изначально задумывался как язык запросов для больших коллекций XML-документов, он также способен преобразовывать отдельные документы. Таким образом, его возможности пересекаются с XSLT , который был специально разработан для преобразования входных XML-документов в HTML или другие форматы.
Стандарты XSLT 2.0 и XQuery были разработаны отдельными рабочими группами в W3C , которые работали вместе, чтобы обеспечить общий подход там, где это уместно. Они используют одну и ту же модель данных ( XDM ), систему типов и библиотеку функций, и оба включают XPath 2.0 в качестве подъязыка.
Однако эти два языка укоренены в разных традициях и служат нуждам разных сообществ. XSLT изначально задумывался как язык таблиц стилей, чьей главной целью было отображение XML для человека на экране, в Интернете (как язык веб-шаблонов ) или на бумаге. XQuery изначально задумывался как язык запросов к базе данных в традициях SQL .
Поскольку эти два языка возникли в разных сообществах, XSLT более эффективен [ по мнению кого? ] при обработке описательных документов с более гибкой структурой, тогда как XQuery более эффективен при обработке данных (например, при выполнении реляционных объединений).
XSLT 1.0 появился как Рекомендация в 1999 году, тогда как XQuery 1.0 стал Рекомендацией только в начале 2007 года; в результате XSLT все еще гораздо более широко используется. Оба языка имеют схожую выразительную силу, хотя XSLT 2.0 имеет много функций, которых нет в XQuery 1.0, таких как группировка, форматирование чисел и дат, а также больший контроль над пространствами имен XML. [10] [11] [12] Многие из этих функций были запланированы для XQuery 3.0. [13]
При любом сравнении необходимо учитывать версию XSLT. XSLT 1.0 и XSLT 2.0 — это совершенно разные языки. В частности, XSLT 2.0 сильно повлиял на XQuery в своем переходе к строгой типизации и распознаванию схем.
Исследования удобства использования показали, что XQuery легче изучать, чем XSLT , особенно для пользователей с предыдущим опытом работы с языками баз данных, такими как SQL. [14] Это можно объяснить тем, что XQuery — это более компактный язык с меньшим количеством концепций для изучения, а также тем, что программы более лаконичны. Также верно, что XQuery более ортогонален, в том смысле, что любое выражение может использоваться в любом синтаксическом контексте. Напротив, XSLT — это двухъязыковая система, в которой выражения XPath могут быть вложены в инструкции XSLT, но не наоборот.
XSLT в настоящее время сильнее XQuery для приложений, которые включают внесение небольших изменений в документ (например, удаление всех элементов NOTE). Такие приложения обычно обрабатываются в XSLT с использованием шаблона кодирования, который включает шаблон идентификации, который копирует все узлы без изменений, измененные определенными шаблонами, которые изменяют выбранные узлы. XQuery не имеет эквивалента этому шаблону кодирования, хотя в будущих версиях можно будет решать такие проблемы с помощью средств обновления в языке, которые находятся в стадии разработки. [15]
XQuery 1.0 не имел какого-либо механизма для динамического связывания или полиморфизма; это было исправлено с введением функций как значений первого класса в XQuery 3.0. Отсутствие этой возможности начинает становиться заметным при написании больших приложений или при написании кода, который предназначен для повторного использования в различных средах. [ необходима цитата ] XSLT предлагает два дополнительных механизма в этой области: динамическое сопоставление правил шаблонов и возможность переопределять правила с помощью xsl:import
, что позволяет писать приложения с несколькими уровнями настройки.
Отсутствие этих возможностей в XQuery 1.0 было преднамеренным решением при проектировании: в результате XQuery очень поддается статическому анализу, что необходимо для достижения уровня оптимизации, необходимого в языках запросов к базам данных. Это также облегчает обнаружение ошибок в коде XQuery во время компиляции.
Тот факт, что XSLT 2.0 использует синтаксис XML , делает его довольно многословным по сравнению с XQuery 1.0. Однако многие крупные приложения используют эту возможность, используя XSLT для динамического чтения, записи или изменения таблиц стилей как часть конвейера обработки. Использование синтаксиса XML также позволяет использовать инструменты на основе XML для управления кодом XSLT. Напротив, синтаксис XQuery больше подходит для встраивания в традиционные языки программирования, такие как Java (см. XQuery API для Java ) или C# . При необходимости код XQuery также может быть выражен в синтаксисе XML, называемом XQueryX. Представление XQueryX кода XQuery довольно многословно и неудобно для людей, но его можно легко обрабатывать с помощью инструментов XML, например, преобразовывать с помощью таблиц стилей XSLT. [16] [17]
W3C разработал два основных расширения XQuery:
Оба получили статус «Рекомендация» как расширения для XQuery 1.0, но работа по их внедрению для работы с XQuery 3.0 была прекращена из-за нехватки ресурсов.
Работа над XQuery 3.0 была опубликована в качестве Рекомендации 8 апреля 2014 года [19] , а XQuery 3.1 является Рекомендацией по состоянию на февраль 2017 года.
Было разработано скриптовое (процедурное) расширение для XQuery, но оно так и не было завершено. [20] [21]
Группа сообщества EXPath [22] разрабатывает расширения для XQuery и других связанных стандартов ( XPath , XSLT , XProc и XForms ). В настоящее время доступны следующие расширения:
JSONiq — это расширение XQuery, которое добавляет поддержку для извлечения и преобразования данных из документов JSON . JSONiq — это надмножество XQuery 3.0. Он опубликован под лицензией Creative Commons Attribution-ShareAlike 3.0 .
XQuery 3.1 фактически прекращает поддержку JSONiq, поскольку в него добавлена полная поддержка JSON.
Проект EXQuery [27] разрабатывает стандарты вокруг создания переносимых приложений XQuery. В настоящее время доступны следующие стандарты:
{{cite web}}
: CS1 maint: numeric names: authors list (link)