XSD 1.1 断言依赖于实现的结果
XSD 1.1 assert implementation-dependant result
考虑以下带有简单断言的简单模式:
<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 验证器说不。
The right operand is not evaluated if the left operand evaluates to true
所以根据 XPath 1.0,应该满足这个断言而不引发错误,因为不应该计算正确的操作数。但是,XSD 1.1 使用 XPath 2.0,它允许依赖于实现的评估顺序,states:
If XPath 1.0 compatibility mode is false [...] an or-expression can
return true if the first expression evaluated is true, and it can
raise an error if evaluation of the first expression raises an error
[...]. A logical expression is not deterministic in the presence of
errors
在XSD 1.1 specs中我们可以清楚的看到:
For an XPath Expression property record X to be valid, all of the following must be true:
[...]
2.2.1 XPath 1.0 compatibility mode is false.
[...]
所以据我了解,在 XSD 1.1 中 XPath 兼容模式是假的,所以断言结果是依赖于实现的,所以 XML 文档应该对相同 XSD 取决于验证器实现 。在这种情况下,Saxon 声明断言得到满足是正确的,而 Xerces 声明断言未得到满足也是正确的。是这样还是我遗漏了什么?
是的,你是对的。如果你想要 (A or B) 保证 A 在 B 之前被评估,那么你可以写 test="if (A) then true() else B"
.
考虑以下带有简单断言的简单模式:
<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 验证器说不。
The right operand is not evaluated if the left operand evaluates to true
所以根据 XPath 1.0,应该满足这个断言而不引发错误,因为不应该计算正确的操作数。但是,XSD 1.1 使用 XPath 2.0,它允许依赖于实现的评估顺序,states:
If XPath 1.0 compatibility mode is false [...] an or-expression can return true if the first expression evaluated is true, and it can raise an error if evaluation of the first expression raises an error [...]. A logical expression is not deterministic in the presence of errors
在XSD 1.1 specs中我们可以清楚的看到:
For an XPath Expression property record X to be valid, all of the following must be true:
[...]
2.2.1 XPath 1.0 compatibility mode is false.
[...]
所以据我了解,在 XSD 1.1 中 XPath 兼容模式是假的,所以断言结果是依赖于实现的,所以 XML 文档应该对相同 XSD 取决于验证器实现 。在这种情况下,Saxon 声明断言得到满足是正确的,而 Xerces 声明断言未得到满足也是正确的。是这样还是我遗漏了什么?
是的,你是对的。如果你想要 (A or B) 保证 A 在 B 之前被评估,那么你可以写 test="if (A) then true() else B"
.