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

How can a range of even integers be defined in XSD?

我是创建模式的新手,几乎是创建 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 枚举来看更好,因为它们不会混淆底层类型。缺点是词条太多,确实如此。但我认为这是较小的邪恶。

在XSD 1.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 机制更清晰。在 XSD 1.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>

这里大部分繁重的工作都是由 min/max 约束完成的,模式仅用于限制值,以便它 (a) 以“-”符号开头,或 (b ) 以偶数结尾。模式不需要重复适用的约束,例如其他字符是数字。