限制XSD中的特定数字

Lin*_*han 4 xml xsd xsd-1.1

我正在尝试创建一个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.也许有一种完全不同的方法,我还没有偶然发现?

编辑:虽然我只是自我回答,但我会在今天打开这个问题,以防有人能提出比我创造的东西更优雅的东西.(我不确定是否删除了这个问题 - 如果您认为这没有用,请标记它或类似的内容.谢谢.)

Lin*_*han 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>
Run Code Online (Sandbox Code Playgroud)

这正是我想要的通用方法的类型.

  • 实际上,这就是我要提出的方法.有些人喜欢使用正则表达式,但我不是其中之一.但是在XSD 1.1中,我可能会使用一个断言:`assert test ="$ value =(1,9到12,15到20)" (3认同)