XSD 1.1断言与实现相关的结果

时间:2015-06-23 10:56:22

标签: xpath xsd saxon xerces xsd-1.1

使用简单的断言来考虑以下简单的Schema:

<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')

左操作数为true,而第二个操作数在计算时产生错误(因为名称函数需要节点参数而不是字符串)。 撒克逊验证员表示断言是满意的,Xerces验证员说不是

根据XPath 1.0 specs

  

如果左操作数的计算结果为true,则不评估右操作数

因此,根据XPath 1.0,应该满足此断言而不会引发错误,因为不应该评估右操作数。但是,XSD 1.1使用XPath 2.0,它允许依赖于实现的评估顺序states

  

如果XPath 1.0兼容模式为false [...] or-expression可以   如果第一个表达式求值为true,则返回true,并且可以   如果第一个表达式的计算引发错误,则引发错误   [...]。 逻辑表达式在存在时不具有确定性   错误

XSD 1.1 specs我们可以清楚地看到:

  

要使XPath表达式属性记录X有效,以下所有内容必须为true

     

[...]

     

2.2.1 XPath 1.0兼容模式为false。

     

[...]

据我了解,在XSD 1.1中,XPath兼容模式为false,因此断言结果与实现有关,因此 XML文档应根据验证器实现对同一XSD有效。在这种情况下,撒克逊正确地断言断言是令人满意的,并且Xerces也正确地声明断言不满意。这是对的还是我错过了什么?

1 个答案:

答案 0 :(得分:3)

是的,你是对的。如果你想要(A或B)保证在B之前评估A,那么你可以写test="if (A) then true() else B"