我试图创建一个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。也许有一种完全不同的方法,我还没有偶然发现?
编辑:虽然我只是自我回答,但我会在今天开启这个问题,以防有人能提出比我创造的东西更优雅的东西。 (我不确定是否删除了这个问题 - 如果您认为这没有用,请标记或类似的内容。谢谢。)答案 0 :(得分:6)
自答案:
整个上午想想它,你不知道,发布问题,然后你的大脑立即想出一个解决方案......
我没想到可以实际使用多个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>
这正是我想要的通用方法的类型。