如何在 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
中的语法,但你明白了。
链接:
- http://www.w3.org/TR/xmlschema11-1/#cAssertions
- http://www.datypic.com/books/defxmlschema/chapter14.html
- Dynamic enumeration restriction using XSD 1.1
当然,使用断言的 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 ) 以偶数结尾。模式不需要重复适用的约束,例如其他字符是数字。
我是创建模式的新手,几乎是创建 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
中的语法,但你明白了。
链接:
- http://www.w3.org/TR/xmlschema11-1/#cAssertions
- http://www.datypic.com/books/defxmlschema/chapter14.html
- Dynamic enumeration restriction using XSD 1.1
当然,使用断言的 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 ) 以偶数结尾。模式不需要重复适用的约束,例如其他字符是数字。