我正在尝试创建一个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"/>据我所知,从我对regexes更有经验的同事看来,这样的正则表达式似乎很难笼统地创建出来。为我的具体示例提供本地化的解决方案并不难,但我正在寻找一个通用解决方案,它很容易得到一个任意列表,比如(1,3-5,9-12,99-999),然后在没有太多麻烦的情况下对它进行XSD限制。
据我所见,将范围分割成包含的所有数字的枚举方法似乎是最有可能的方法,但它仍然是非常丑陋的。
这是关于XSD1.1的。也许有一种完全不同的方法,我还没有偶然发现呢?
编辑:即使我只是自我回答,我还是会把这个问题留到今天,以防有人能想出比我创建的the...thing更优雅的东西。(我不确定是否删除这个问题-如果你认为这没有帮助,请标记它或诸如此类的东西。谢谢。)
发布于 2015-08-14 07:49:14
自我回答:
想想看整个上午你都不知道,发个问题然后你的大脑马上想出一个解决办法.
我并没有想到实际使用多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>这正是我想要的通用方法的类型。
https://stackoverflow.com/questions/32004764
复制相似问题