2015-06-23 6 views
3

Рассмотрим следующую простую схему с простым утверждением:XSD 1,1 утверждают, зависит от реализации результата

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:assert test="(8 = 8) or name('error')"></xs:assert> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Давайте посмотрим на утверждение:

(8 = 8) or name('error') 

Левый операнд является истинным, а второй один производит ошибка, если она оценивается (поскольку функции имен ожидает параметр узла, а не строку). Саксонский валидатор говорит, что утверждение удовлетворено, проверщик Xerces говорит, что это не.

Согласно XPath 1.0 specs

правый операнд не вычисляется, если левый операнд имеет значение истинного

Итак, в соответствии с XPath 1.0 это утверждение должно быть выполнено без возникновения ошибки как правый операнд не должен оцениваться. Тем не менее, XSD 1.1 использует XPath 2.0, которая позволяет зависящее от реализации порядка оценки, states:

Если режим XPath 1.0 Совместимость ложно [...] к или выражение может возвращает истину, если первое выражение оценен, и он может поднять ошибку, если оценка первого выражения вызывает ошибку [...]. Логическое выражение не является детерминированным в присутствии ошибок

В XSD 1.1 specs можно четко прочитать:

Для XPath Expression звукозаписывающей свойство X, чтобы быть действительным, все следующие сусле правда:

[...]

2.2.1 Режим совместимости XPath 1.0 является ложным.

[...]

Так как я понимаю, в XSD режим совместимости 1,1 XPath является ложным, так что результат утверждения зависит от реализации, так документа XML Шоуда быть действительным в отношении того же XSD в зависимости от реализации валидатора. В этом случае Саксон прав, утверждая, что утверждение удовлетворено, и Xerces также прав, заявив, что это утверждение не выполняется. Это правильно или я что-то упускаю?

ответ

3

Да, вы правы. Если вы хотите (A или B), где A гарантированно оценивается до B, тогда вы можете написать test="if (A) then true() else B".

+0

спасибо. Знаете ли вы, почему в спецификациях XSD 1.1 было указано, что режим совместимости XPath должен быть установлен как false вместо true, что уменьшит результаты, зависящие от реализации? Это было сделано для упрощения разработки валидаторов? – sergioFC

+1

Я думаю, что в общем случае существует такое же определенное поведение при реализации, когда режим совместимости XPath включен, когда он выключен.Основной причиной отказа от использования режима совместимости является то, что он не был разработан для работы с системой типа XSD, тогда как XPath 2.0 был. –

+0

Приятно знать, что, еще раз спасибо. – sergioFC