【发布时间】:2015-06-23 10:56:21
【问题描述】:
考虑以下带有简单断言的简单模式:
<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,它允许依赖于实现的评估顺序,states:
如果 XPath 1.0 兼容模式为 false [...] or 表达式可以 如果评估的第一个表达式为真,则返回真,并且它可以 如果第一个表达式的评估引发错误,则引发错误 [...]。 一个逻辑表达式在存在的情况下不是确定性的 错误
在XSD 1.1 specs我们可以清楚地看到:
要使 XPath 表达式属性记录 X 有效,以下所有条件都必须为真:
[...]
2.2.1 XPath 1.0 兼容模式为假。
[...]
据我所知,在 XSD 1.1 中,XPath 兼容模式为 false,因此断言结果取决于实现,因此 XML 文档应该对相同的 XSD 有效,具体取决于验证器实现。在这种情况下,Saxon 正确地说明了断言得到满足,而 Xerces 也正确地说明了断言没有得到满足。这是对的还是我错过了什么?
【问题讨论】:
标签: xpath xsd saxon xerces xsd-1.1