首页 文章

XSD 1.1断言与实现相关的结果

提问于
浏览
3

通过一个简单的断言来考虑以下简单的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 .

根据XPath 1.0 specs

如果左操作数的计算结果为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 回答

  • 3

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

相关问题