使用简单的断言来考虑以下简单的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验证员说不是。
如果左操作数的计算结果为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也正确地声明断言不满意。这是对的还是我错过了什么?
答案 0 :(得分:3)
是的,你是对的。如果你想要(A或B)保证在B之前评估A,那么你可以写test="if (A) then true() else B"
。