我正在尝试创建一个 XSD,它应该验证 XML 元素的整数值。我想要实现的是能够将此值限制为多个范围(因此 min/maxInclusive 不会这样做)和一些特定值。
让我们举个例子。我希望元素有效,如果它包含 1、9 到 12 之间的数字或 15 到 20 之间的数字。我试图想出一个模式
<xs:pattern value="[(1)(9-12)(15-20)]"/>
但这不起作用,因为(据我了解)9-12 部分执行类似 9|0|1.... 的操作,因为它不能将 12 解释为一个整体。用个位数的数字,如
<xs:pattern value="[(1)(3-5)(7-9)]"/>
它确实有效。我试图将多位数字括在更多的括号中,例如 9-(12),但无济于事。
我可以尝试以这样的方式使用枚举:
<xs:restriction base="xs:integer">
<xs:enumeration value="1"/>
<xs:enumeration value="9"/>
<xs:enumeration value="10"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
....
</xs:restriction>
,但这是非常不切实际的,尤其是对于大范围。模式形式的相同事物也是如此:
<xs:pattern value="1|9|10|11|12|15....."/>
所以我现在看到了两条路径:要么有一个模式,我自己无法想出,它允许我使用多个单个数字和范围,包括多位数字,或者有一种方法可以做某事喜欢
<xs:enumeration value="9"-"12"/>
据我所知,一般来说,创建这样一个正则表达式似乎相当困难,我的同事们对正则表达式有更多经验。在这里为我的确切示例提出本地化解决方案并不太难,但我正在寻找一个通用解决方案,通过它很容易得到一个任意列表,如 (1,3-5,9-12,99 -999) 并在没有太多麻烦的情况下对其进行 XSD 限制。
据我所知,将范围拆分为包含的所有数字的枚举方法似乎是最有可能实际可行的方法,但它仍然会非常难看。
这是关于 XSD 1.1。也许有一种完全不同的方法我还没有偶然发现?
编辑:即使我只是自我回答,我将把问题留到今天,以防有人能想出比我创造的东西更优雅的东西。(我不确定删除问题 - 如果您认为这没有帮助,请标记它或类似的东西。谢谢。)