【问题标题】:XSD 1.1 assert implementation-dependant resultXSD 1.1 断言依赖于实现的结果
【发布时间】: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 specs

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

所以根据 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


    【解决方案1】:

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

    【讨论】:

    • 谢谢。您知道为什么在 XSD 1.1 规范中声明 XPath 兼容模式必须设置为 false 而不是 true,这会减少与实现相关的结果?这样做是为了简化验证器的开发吗?
    • 我认为一般来说,当 XPath 兼容模式打开时,实现定义的行为可能与关闭时一样多。不使用兼容模式的主要原因是它不是为与 XSD 类型系统一起工作而设计的,而 XPath 2.0 是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多