Xml 限制XSD中的特定数字

Xml 限制XSD中的特定数字,xml,xsd,xsd-1.1,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。 使用一位数的数字,如 &

我试图创建一个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限制

据我所见,将范围拆分为包含的所有数字的枚举方法似乎是最有可能的方法,但它仍然非常丑陋

这是关于XSD1.1的。也许有一个完全不同的方法,我还没有偶然发现

编辑:虽然我只是自我回答,但我会把问题留到今天,以防有人能想出比我创造的东西更优雅的东西。(我不确定是否要删除该问题-如果您认为这没有帮助,请标记它或类似的内容。谢谢。)

自我回答:

想了一上午,你就不知道了,把问题贴出来,你的大脑马上就会想出一个解决方案

我没有想到实际上可以使用多个min/maxInclusive,因为我从名称和其他方面考虑,它们将非常独特。事实并非如此,所以我想出了一个美丽的令人憎恶的东西:

<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>


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

事实上,这就是我要建议的方法。有些人喜欢在任何事情上使用正则表达式,但我不是其中之一。不过,在XSD1.1中,我可能会使用一个断言:
assert test=“$value=(1,9到12,15到20)”
我对您的评论感到荣幸。有趣的可能性,我没有考虑过,但我们正在尝试的是将尽可能多的结构化内容(minInclusive、length等)放入类型中,以使断言部分尽可能短(出于多种原因)。但谢谢你教我一些未来可能应用的东西。