考虑以下带有简单断言的简单模式:
<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')
左操作数为真,而第二个操作数在计算时会产生错误(因为名称函数需要节点参数而不是字符串)。Saxon 验证器说断言满足,Xerces 验证器说不满足。
如果左操作数的计算结果为真,则不计算右操作数
所以根据 XPath 1.0,这个断言应该被满足而不会引发错误,因为不应该评估正确的操作数。但是,XSD 1.1 使用 XPath 2.0,它允许依赖于实现的评估顺序,状态:
如果 XPath 1.0 兼容模式为 false [...],如果第一个表达式评估为 true,则 or 表达式可以返回 true,如果第一个表达式的评估引发错误,它会引发错误 [...]。存在错误时,逻辑表达式不是确定性的
在XSD 1.1 规范中,我们可以清楚地阅读:
要使 XPath 表达式属性记录 X 有效,必须满足以下所有条件:
[...]
2.2.1 XPath 1.0 兼容模式为假。
[...]
据我了解,在 XSD 1.1 中,XPath 兼容模式为假,因此断言结果依赖于实现,因此XML 文档应该对相同的 XSD 有效,具体取决于验证器实现。在这种情况下,Saxon 正确地说明了断言得到满足,而 Xerces 也正确地说明了断言没有得到满足。这是对的还是我错过了什么?