我正在尝试创建一个XSD,它应该验证XML元素的整数值.我想要实现的是能够将此值限制为多个范围(因此min/maxInclusive不会这样做)和一些特定值.
我们举个例子吧.我希望元素有效,如果它包含1,一个介于9和12之间的数字,或一个介于15和20之间的数字.我试图想出一个模式
<xs:pattern value="[(1)(9-12)(15-20)]"/>
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为(据我所知)9-12部分做了类似9 | 0 | 1 ....的事情,因为它解释了12不是一个整体.有一位数的数字
<xs:pattern value="[(1)(3-5)(7-9)]"/>
Run Code Online (Sandbox Code Playgroud)
它确实有效.我试图将多位数用数字放在更多的括号中,如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>
Run Code Online (Sandbox Code Playgroud)
,但这是非常不切实际的,特别是对于大范围.模式形式也是如此:
<xs:pattern value="1|9|10|11|12|15....."/>
Run Code Online (Sandbox Code Playgroud)
所以我现在看到两条路径:要么有一个模式,我自己无法想出,这允许我使用多个单个数字和范围,包括多位数,或者有办法以某种方式做某事喜欢
<xs:enumeration value="9"-"12"/>
Run Code Online (Sandbox Code Playgroud)
一般来说,创建这样一个正则表达式似乎很难,据我所知,具有更多正则表达式经验的同事说.在这里提出我的确切示例的本地化解决方案并不太难,但我正在寻找一个通用的解决方案,使用它很容易得到任意列表(1,3-5,9-12,99) -999)并在没有太多麻烦的情况下制定XSD限制.
从我看到的,将范围拆分为所有数字的枚举方法似乎是最可能实际可行的方法,但它仍然是非常难看的.
这是关于XSD 1.1.也许有一种完全不同的方法,我还没有偶然发现?
编辑:虽然我只是自我回答,但我会在今天打开这个问题,以防有人能提出比我创造的东西更优雅的东西.(我不确定是否删除了这个问题 - 如果您认为这没有用,请标记它或类似的内容.谢谢.)
自答案:
想想整个上午,你不知道,发布问题,然后你的大脑立即想出一个解决方案......
我没有想到可以实际使用多个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>
Run Code Online (Sandbox Code Playgroud)
这正是我想要的通用方法的类型.
| 归档时间: |
|
| 查看次数: |
1235 次 |
| 最近记录: |