3

考虑以下带有简单断言的简单模式:

<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 规范

如果左操作数的计算结果为真,则不计算右操作数

所以根据 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 也正确地说明了断言没有得到满足。这是对的还是我错过了什么?

4

1 回答 1

3

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

于 2015-06-23T14:53:10.780 回答