是否可以限制XSD属性遵循数字顺序?

时间:2015-03-30 12:30:11

标签: xml xsd

例如,如果我有以下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>

2 个答案:

答案 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]