D.3. Ограничения XML и соответствие SQL/XML#
D.3. Ограничения XML и соответствие SQL/XML
Значительные изменения в спецификациях, связанных с XML, в ISO/IEC 9075-14 (SQL/XML), были внесены в SQL:2006. Реализация типа данных XML и связанных функций в Tantor SE в значительной степени соответствует ранней версии 2003 года, с некоторыми заимствованиями из более поздних версий. В частности:
Где текущий стандарт предоставляет семейство типов данных XML для хранения “документа” или “содержимого” в неопределенных или типизированных вариантах XML Schema, а также тип
XML(SEQUENCE)
для хранения произвольных фрагментов XML-содержимого, Tantor SE предоставляет единственный типxml
, который может содержать “документ” или “содержимое”. Эквивалента стандартного типа “sequence” нет.Tantor SE предоставляет две функции, введенные в SQL:2006, но в вариантах, которые используют язык XPath 1.0, а не XML Query, как указано в стандарте.
Этот раздел представляет некоторые из возможных различий, с которыми вы можете столкнуться.
D.3.1. Запросы ограничены XPath 1.0
Специфичные для Tantor SE функции
xpath()
и xpath_exists()
запрашивают XML-документы с использованием языка XPath.
Tantor SE также предоставляет варианты функций,
использующих только XPath, стандартных функций XMLEXISTS
и
XMLTABLE
, которые официально используют
язык XQuery. Для всех этих функций
Tantor SE полагается на
библиотеку libxml2, которая поддерживает только XPath 1.0.
Есть тесная связь между языком XQuery и версиями XPath 2.0 и более поздними: любое выражение, которое является синтаксически правильным и успешно выполняется в обоих языках, дает одинаковый результат (за исключением выражений, содержащих числовые символьные ссылки или предопределенные символьные ссылки, которые XQuery заменяет соответствующим символом, в то время как XPath оставляет их без изменений). Однако между этими языками и XPath 1.0 такой связи нет; это более ранний язык и отличается во многих отношениях.
Существуют две категории ограничений, которые следует учитывать: ограничение от XQuery к XPath для функций, указанных в стандарте SQL, и ограничение XPath до версии 1.0 как для стандартных, так и для специфичных для Tantor SE функций.
D.3.1.1. Ограничение XQuery до XPath
Особенности XQuery, выходящие за рамки XPath, включают:
XQuery выражения могут создавать и возвращать новые узлы XML, в дополнение ко всем возможным значениям XPath. XPath может создавать и возвращать значения атомарных типов (числа, строки и т. д.), но может возвращать только узлы XML, которые уже присутствуют в документах, предоставленных в качестве входных данных для выражения.
XQuery имеет конструкции управления для итерации, сортировки и группировки.
XQuery позволяет объявлять и использовать локальные функции.
Недавние версии XPath начинают предлагать возможности, перекрывающиеся с этими (такие как функциональный стиль for-each
и sort
, анонимные функции и parse-xml
для создания узла из строки), но такие функции не были доступны до XPath 3.0.
D.3.1.2. Ограничение XPath до версии 1.0
Для разработчиков, знакомых с XQuery и XPath 2.0 или более поздней версией, XPath 1.0 представляет ряд различий, с которыми следует справиться:
Основной тип выражения XQuery/XPath,
последовательность
, который может содержать узлы XML, атомарные значения или и то, и другое, не существует в XPath 1.0. Выражение 1.0 может только создавать набор узлов (содержащий ноль или более узлов XML) или единственное атомарное значение.В отличие от последовательности XQuery/XPath, которая может содержать любые желаемые элементы в любом желаемом порядке, набор узлов XPath 1.0 не имеет гарантированного порядка и, как любое множество, не позволяет множественное появление одного и того же элемента.
Примечание
Библиотека libxml2 кажется всегда возвращать наборы узлов в Tantor SE с их элементами в том же относительном порядке, который они имели во входном документе. Ее документация не обязывает к такому поведению, и выражение XPath 1.0 не может его контролировать.
В то время как XQuery/XPath предоставляет все типы, определенные в XML Schema и множество операторов и функций над этими типами, XPath 1.0 имеет только наборы узлов и три атомарных типа
boolean
,double
иstring
.XPath 1.0 не имеет условного оператора. Выражение XQuery/XPath такое как
if ( hat ) then hat/@size else "no hat"
не имеет эквивалента в XPath 1.0.XPath 1.0 не имеет оператора сравнения порядка для строк. И
"cat" < "dog"
и"cat" > "dog"
являются ложными, потому что каждое из них является числовым сравнением двухNaN
. В отличие от этого, операторы=
и!=
сравнивают строки как строки.XPath 1.0 смешивает понятия сравнения значений и общих сравнений, как это определено в XQuery/XPath. Оба выражения
sale/@hatsize = 7
иsale/@customer = "alice"
являются сравнениями существования, trueи, если существует любаяsale
с заданным значением атрибута. Однако выражениеsale/@taxable = false()
является сравнением значений с эффективным логическим значением всего набора узлов. Оно истинно только в том случае, если ни однаsale
не имеет атрибутаtaxable
вообще.В модели данных XQuery/XPath узел документа может иметь либо форму документа (т.е. ровно один элемент верхнего уровня, с комментариями и инструкциями обработки только вне его), либо форму содержимого (с более свободными ограничениями). Его эквивалент в XPath 1.0, корневой узел, может быть только в форме документа. Это частично объясняет, почему значение
xml
, переданное в качестве контекстного элемента любой функции на основе XPath в Tantor SE, должно быть в форме документа.
Различия, выделенные здесь, не являются полными. В XQuery и в версиях XPath 2.0 и более поздних существует режим совместимости с XPath 1.0, и списки W3C изменений в библиотеке функций и изменений в языке применяемые в этом режиме, предлагают более полное (но все еще не исчерпывающее) описание различий. Режим совместимости не может сделать более поздние версии языков полностью эквивалентными XPath 1.0.
D.3.1.3. Отображения между типами данных и значениями SQL и XML
В SQL:2006 и позднее оба направления преобразования между стандартными типами данных SQL и типами XML Schema указаны точно. Однако правила выражены с использованием типов и семантики XQuery/XPath и не имеют прямого применения к различной модели данных XPath 1.0.
Когда Tantor SE отображает значения данных SQL в XML (как в xmlelement
), или XML в SQL (как в выходных столбцах xmltable
), за исключением нескольких особых случаев, Tantor SE просто предполагает, что строковая форма XPath 1.0 типа данных XML будет допустима в качестве текстовой формы входного типа данных SQL и наоборот. Это правило имеет преимущество простоты, при этом для многих типов данных результаты аналогичны отображениям, указанным в стандарте.
Где важна совместимость с другими системами, для некоторых типов данных может потребоваться явное использование функций форматирования типов данных (например, тех, которые описаны в Раздел 9.8) для создания стандартных отображений.
D.3.2. Второстепенные ограничения реализации
Этот раздел касается ограничений, которые не являются врожденными в библиотеке libxml2, но применяются к текущей реализации в Tantor SE.
D.3.2.1. Только механизм передачи BY VALUE
поддерживается.
Стандарт SQL определяет два механизма передачи при передаче аргумента XML из SQL в XML-функцию или при получении результата: BY REF
, при котором конкретное значение XML сохраняет свою идентичность узла, и BY VALUE
, при котором передается содержимое XML, но идентичность узла не сохраняется. Механизм может быть указан перед списком параметров в качестве механизма по умолчанию для всех них или после любого параметра, чтобы переопределить значение по умолчанию.
Чтобы проиллюстрировать разницу, если x
является значением XML, эти два запроса в среде SQL:2006 будут соответственно возвращать true и false:
SELECT XMLQUERY('$a is $b' PASSING BY REFx
AS a,x
AS b NULL ON EMPTY); SELECT XMLQUERY('$a is $b' PASSING BY VALUEx
AS a,x
AS b NULL ON EMPTY);
Tantor SE примет
BY VALUE
или BY REF
в
конструкции XMLEXISTS
или XMLTABLE
,
но они будут проигнорированы. Тип данных xml
хранит
сериализованное представление в виде символьной строки, поэтому нет
необходимости сохранять идентификатор узла, и передача всегда
фактически происходит по значению (BY VALUE
).
D.3.2.2. Невозможно передавать именованные параметры в запросы
Функции, основанные на XPath, поддерживают передачу одного параметра в качестве контекстного элемента выражения XPath, но не поддерживают передачу дополнительных значений для доступа к выражению в качестве именованных параметров.
D.3.2.3. Нет типа XML(SEQUENCE)
Тип данных Tantor SE xml
может содержать только значение в форме DOCUMENT
или CONTENT
. Контекстный элемент выражения XQuery/XPath
должен быть единственным узлом XML или атомарным значением, но XPath 1.0
дополнительно ограничивает его только узлом XML и не имеет типа узла,
позволяющего использовать CONTENT
. В результате
хорошо сформированный DOCUMENT
является единственной формой
значения XML, которое Tantor SE может предоставить в качестве контекстного элемента XPath.