Relaxng схема и схема XML Schema для каждого XML?
Существует ли набор документов XML, для которых мы можем сформулировать ГСЧ, но не схему XML (или наоборот)? Можете ли вы дать мне пример, пожалуйста?
1 ответ
Как показал обмен ОП с МК, здесь есть некоторая возможность недопонимания. Так что я предложу здесь ответ, хотя MK на самом деле уже ответил на вопрос.
Я предполагаю, что вопрос в том, обладают ли XSD и RNG одинаковой выразительной способностью, и если нет, один из них более выразителен, чем другой.
То есть: каждая схема определяет набор документов (а именно, набор, действительный по отношению к схеме). Существует (как говорит МК) очень много наборов документов, для которых ни один язык не может определить схему, которая принимает как действительные только документы в этом наборе. Итак, возможно, самый ясный способ поставить вопрос:
Учитывая схему на языке схем L1, гарантированно ли существует схема на языке схем L2, которая принимает как действительный тот же набор входных документов?
Или эквивалентно:
Существуют ли схемы, выражаемые на языке L1, которые не имеют эквивалента на языке L2?
Ответ заключается в том, что каждый из упомянутых языков схем может выражать некоторые схемы, не выражаемые с помощью другого.
Я оставлю в стороне мелочи вроде xsi:type
и возможные особенности использования Relax NG простых типов XSD и вопросы о том, что именно мы подразумеваем под набором документов, принимаемых схемой, хотя эти моменты могут быть важны в некоторых контекстах.
Схемы RelaxNG без эквивалентов XSD:
Как указывает MK, схемы RelaxNG могут управлять расположением символьных данных без пробелов:
(a, b, text, c, d)
- это допустимая контекстная модель в Relax NG, которой нет эквивалента в XSD.Итак, в качестве примера схемы Relax NG (в компактном синтаксисе), не имеющей эквивалента в XSD, рассмотрим следующее:
start = e e = element e { (e, text, e)? }
Модели содержимого XSD должны быть детерминированными (на жаргоне спецификации XSD они должны подчиняться ограничению уникальной атрибуции частиц), в то время как модели содержимого Relax NG не должны быть такими. Таким образом, возможные последовательности ходов для шахматной партии можно выразить в Relax NG, но не в XSD:
(white, black)*, white?
. (Поскольку у каждого недетерминированного FSA есть детерминированный эквивалент, людей иногда удивляет, что это не так для моделей контента: это не тот случай, когда каждую недетерминированную модель контента можно переписать как эквивалентную детерминированную модель контента. Анне Брюггеманн - Кляйн определила набор обычных языков, для которых не существует детерминированных моделей содержания, пару десятилетий назад в ее хабилитационной брошюре.)start = element game { (white, black)*, white? } white = element white {sq} black = element black {sq} sq = attribute square { text }
Поскольку Relax NG включает атрибуты в модели содержимого, в Relax NG можно сделать эффективную модель содержимого элемента зависимой от значения одного из его атрибутов способами, которые возможны в XSD 1.1, но не в XSD 1.0.
start = element whaddyawant { (attribute gimme { 'a' }, a+) | (attribute gimme { 'b' }, b+) } a = element a { empty } b = element b { empty }
Схемы XSD без эквивалентов RelaxNG:
XSD определяет типы для поддержки ограничений ID/IDREF, выражаемых в XML DTD; Relax NG относит их к отдельной "совместимости с DTD", что (по крайней мере, по моему опыту) неудобно и подвержено ошибкам на практике. В частности, если схема объявляет атрибут типа ID, любой элемент с подстановочными знаками с атрибутами подстановочных знаков может вызвать проблемы.
Схемы XSD могут определять ограничения уникальности, ключа и ссылки на ключ, которые не выражаются в схемах Relax NG. Пример:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="digraph" type="DG"> <xs:key name="node-ids"> <xs:selector xpath="node"/> <xs:field xpath="@nodeID"/> </xs:key> <xs:keyref refer="node-ids" name="arc-ends"> <xs:selector xpath="node"/> <xs:field xpath="@arc-to"/> </xs:keyref> </xs:element> <xs:element name="node" type="N"/> <xs:complexType name="DG"> <xs:sequence> <xs:element ref="node" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="N"> <xs:attribute name="nodeID" type="xs:integer"/> <xs:attribute name="arc-to" type="xs:integer" use="optional"/> </xs:complexType> </xs:schema>
Утверждения XSD 1.1 не имеют аналога в Relax NG, и с их помощью можно выражать ограничения, которые нельзя выразить в Relax NG. Например, в каждом
district
элемент, значение вtotal/@n
должен быть равен суммеn
атрибуты на других дочерних элементах (number(total/@n) eq sum((* except total)/@n)
). Пример оставлен в качестве упражнения для читателя.
Обратите внимание, что MK не совсем правильно говорит: "XSD может определять более точные правила для диапазона мощности, разрешенного для дочерних элементов". Я не верю, что в XSD есть какое-либо ограничение количества элементов, которое нельзя выразить в Relax NG. Это правда, что было бы довольно утомительно выражать в Relax NG ограничение, которое говорит, что в счете-фактуре должна быть хотя бы одна строка, но не более 999 строк. Но это, конечно, возможно. Модель содержания, которая гласит, что должен быть хотя бы один, но не более девятиa
элементы (a, a?, a?, a?, a?, a?, a?, a? a?)
. Легко понять, как это расширить, чтобы справиться с 999 строками в счете.
Когда вы говорите о "наборе документов XML, для которого мы можем сформулировать схему", подразумеваете ли вы, что схема должна принимать каждый документ в наборе и отклонять каждый документ из набора? В общем, если вы начинаете с произвольного набора документов, очень маловероятно, что вы сможете сформулировать такую схему, независимо от того, какой язык схемы вы выберете. И, безусловно, верно, что наборы документов, которые имеют это свойство, будут отличаться от одного языка схемы к другому.
Более того, если ваш набор документов конечен, то на самом деле не очень полезно определять такую схему, потому что будет невозможно написать какие-либо новые документы, которые соответствуют этой схеме. Если набор документов бесконечен, то единственный реальный способ определить набор документов - написать схему, которой они соответствуют, что делает все это бессмысленным.
Есть некоторые ограничения, которые можно выразить в RNG, но не в XSD, а также есть некоторые ограничения, которые можно выразить в XSD, а не в RNG.
Например, RelaxNG может определять более точные правила для содержимого текстовых узлов в смешанном содержимом, в то время как XSD может определять более точные правила для диапазона мощностей, разрешенного для дочерних элементов.
Детальное сравнение зависит от того, о какой версии XSD вы говорите.