限制XSD中的特定数字

时间:2015-08-14 07:39:47

标签: xml xsd xsd-1.1

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

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

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>

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