例如,如果我有以下XML文档:
<course name="math">
<grade attempt="1">F</grade>
<grade attempt="2">F</grade>
<grade attempt="3">B</grade>
</course>
如果存在1,则如何使用XSD验证属性“尝试”的值是否为2,如果存在2,则值为3,依此类推?
编辑以使其更清晰,我需要的是第一个元素在属性中具有值“1”的可能性,并且每个连续的兄弟都将值增加一个。< / p>
答案 0 :(得分:4)
是的,这可能但不适用于XSD 1.0。
最简单的解决方案:完全删除@attempt
属性;它没有任何补充。
我建议您重新检查明确强制执行约束的目标,否则如果有暗示则可以免费获得。删除@attempt
属性,该属性仅用于标识序列中grade
元素的位置,并且让序列暗示,如果没有先前已存在的位置,则不存在后续序列位置。< / p>
XSD 1.0无法以原始形式提供您的请求,并且使用XSD 1.1断言或Schematron或外部代码是过度的。只需删除@attempt
,您就可以轻松使用XSD 1.0,并且还可以简化应用程序开发。您可以根据序列位置在任何需要的位置生成尝试编号。
答案 1 :(得分:1)
您已经建议了两种可能要强制执行的约束:
(a)“遵循数字顺序”。我会读到这一点,在每个元素上,@ attempt的值必须大于(不一定大于1),而不是之前的@attempt。例如1,2,4是合法的,但1,4,2不是。
(b)“如果存在1则仅具有值2”。我会读到这一点,说这组尝试值形成一个密集的数字序列,不一定是有序的。例如,序列3,1,2是可以接受的,但4,1,2不会。
这是什么?如果您对它的描述模糊不清,我们无法帮助您编写约束。
无论哪种方式,只要我们知道约束的真正含义,就可以很容易地使用XSD 1.1断言来描述约束。
更新
你说规则是@attempt值应该严格地为1,2,3等。在这种情况下,一个合适的断言可能是
every $g in grade satisfies $g/@attempt eq count($g/preceding-sibling::grade)+1]