Xml 如何在XSD中定义偶数整数的范围?

Xml 如何在XSD中定义偶数整数的范围?,xml,xsd,Xml,Xsd,我对创建模式是全新的,对创建XML几乎是全新的。我正在尝试开发一个简单的基于整数的类型(尽管我会满足于基于字符串的类型),该类型将值限制为-1,然后是通过254的偶数 到目前为止,我发现: <xs:simpleType name="toffset"> <xs:restriction base="xs:integer"> <xs:minInclusive value="-1"/> <xs:maxInclusive va

我对创建模式是全新的,对创建XML几乎是全新的。我正在尝试开发一个简单的基于整数的类型(尽管我会满足于基于字符串的类型),该类型将值限制为-1,然后是通过254的偶数

到目前为止,我发现:

   <xs:simpleType name="toffset">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="-1"/>
      <xs:maxInclusive value="254"/>
    </xs:restriction>


这段代码当然不会将值>-1限制为偶数整数。我考虑过创建一个枚举,但对于这么多的值来说,这似乎很难实现。如何实现所需的限制?

您可以使用正则表达式执行此操作:

  <xs:simpleType name="loanNumberType">
    <xs:restriction base="xs:string">
      <xs:pattern value="-1"/>
      <xs:pattern value="[02468]"/>
      <xs:pattern value="[1-9][02468]"/>
      <xs:pattern value="1[0-9][02468]"/>
      <xs:pattern value="2[0-4][02468]"/>
      <xs:pattern value="25[024]"/>
    </xs:restriction>
  </xs:simpleType>

在XSD 1.0中,您可以按照自己的建议定义枚举,也可以按照Kenneth的建议定义用户模式。从我的PoV枚举来看,它们更好,因为它们不会混淆底层类型。缺点是条目太多,这是真的。但我认为这是较小的邪恶

在XSD1.1中。你可以这样做

<xs:simpleType name="toffset">
  <xs:restriction base="xs:integer">
    <xs:assertion test="$value = -1 or ($value <= 254 and ($value mod 2) = 0)"/>
  </xs:restriction>
</xs:simpleType>

我不太清楚
@test
中的语法,但你明白了

链接:


当然,使用断言的XSD 1.1机制更干净。在XSD1.0中,以这种方式限制整数的唯一方法是使用模式方面,正如@kjhughes所建议的那样。但是,您可以对整数使用模式,它们不仅仅适用于字符串

我想我会这样做:

<xs:simpleType name="toffset">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="-1"/>
      <xs:maxInclusive value="254"/>
      <xs:pattern value="-.*|.*[02468]"/>
    </xs:restriction>
</xs:simpleType>


在这里,大多数重载是通过最小/最大约束完成的,模式仅用于限制值,以便(a)以“-”符号开头,或(b)以偶数数字结尾。模式无需重复应用的约束,例如,其他字符是数字。

我认为这是一个有趣的想法。我有点不喜欢我们把
xs:string
作为基本类型(可能是
xs:pattern
所必需的),这有点违背了目标类型的本质,在许多工具中都会被误传。当我想到正则表达式可以捕获偶数/奇数属性时,我确实有点嘲笑自己。:-)Michael的答案建立在这个基础上,但更好地保留了自然的数字类型。啊,从来没有考虑过正则表达式模式可以处理整数+1给你,10给任何以这种令人愉快的方式改进XSD1.0 Rec规则性的人!在某些情况下(1K个条目;1M个条目;无限个条目?),如果不能使用XSD 1.1,枚举的罪恶性将超过使用字符串而不是整数的罪恶性。:-)但是,是的,我同意这种看法(+1)。不过,看看迈克尔·凯的冷静回答。@kjhughes是的,看到了。这是XSD 1.0的最佳选择。我真的很感谢所有的好答案。其中任何一个都可以完成任务,前两个看起来可能是1.0和1.1(分别)最干净的解决方案。最终,我将Michael的答案标记为认可的答案,因为我的工具(我在Delphi XE7中工作)似乎没有意义地支持1.1。然而,一旦出现这种情况,我会更喜欢使用断言——因此,Lexicore的答案最终将是我的首选方法。再次感谢大家——我从你们的回答中学到了很多。