D.3. Ограничения XML и соответствие SQL/XML#

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 REF x AS a, x AS b NULL ON EMPTY);
SELECT XMLQUERY('$a is $b' PASSING BY VALUE x 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.