我正在尝试创建一个 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 的。也许我还没有偶然发现一种完全不同的方法?
编辑:虽然我只是 self 回答,但我会把这个问题留到今天,以防有人想出比...我创造的东西更优雅的东西。 (我不确定是否删除问题 - 如果您认为这没有帮助,请标记它或类似的东西。谢谢。)
最佳答案
self 回答:
想了一上午都不知道,把问题贴出来,然后你的大脑立刻想出了一个解决方案...
我没想到实际上可以使用多个 min/maxInclusives,因为我从名称中想到它们几乎是独一无二的。好吧,事实并非如此,所以我想到了这个美丽的可憎之物:
<xs:simpleType name="RANGETEST_Data">
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="9"/>
<xs:maxInclusive value="12"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="15"/>
<xs:maxInclusive value="20"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:enumeration value="1"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
这正是我想要的通用方法类型。
关于xml - 限制 XSD 中的特定数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32004764/