通过一个简单的断言来考虑以下简单的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,而第二个操作数在计算时产生错误(因为名称函数需要节点参数而不是字符串) . Saxon validator says assertion is satisfied, Xerces validator says is not .
如果左操作数的计算结果为true,则不评估右操作数
因此,根据XPath 1.0,应该在不引发错误的情况下满足此断言,因为不应该评估右操作数 . 但是,XSD 1.1使用XPath 2.0,它允许依赖于实现的评估顺序states:
如果XPath 1.0兼容模式为false [...],如果第一个表达式求值为true,则or-expression可以返回true,如果第一个表达式的求值引发错误,则可能引发错误[...] . 在存在错误的情况下,逻辑表达式不是确定性的
在XSD 1.1 specs中我们可以清楚地看到:
要使XPath Expression属性记录X有效,必须满足以下所有条件:[...] 2.2.1 XPath 1.0兼容模式为false . [...]
据我了解,在XSD 1.1中,XPath兼容模式为false,因此断言结果与实现有关,所以 XML document shoud be valid against the same XSD depending on validator implementation . 在这种情况下,撒克逊正确地断言断言是令人满意的,并且Xerces也说得断言不满意 . 这是对的还是我错过了什么?
1 回答
是的,你是对的 . 如果你想要(A或B)保证在B之前评估A,那么你可以写
test="if (A) then true() else B"
.