我是创建架构的新手,几乎是创建XML的新手。我正在尝试开发一个简单的基于整数的类型(尽管我会选择基于字符串的类型),它将值限制为-1,然后将整数限制为254.
到目前为止,我已经想到了:
<xs:simpleType name="toffset">
<xs:restriction base="xs:integer">
<xs:minInclusive value="-1"/>
<xs:maxInclusive value="254"/>
</xs:restriction>
该代码当然不会将值&gt; -1限制为偶数整数。我考虑过创建一个枚举,但对于这么多的值来说这似乎很笨拙。我怎样才能达到预期的限制?
答案 0 :(得分:4)
当然,使用断言的XSD 1.1机制更清晰。在XSD 1.0中,以这种方式限制整数的唯一方法是使用模式facet,正如@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)以“ - ”符号结束甚至数字。模式不需要重复适用的约束,例如:其他字符都是数字。
答案 1 :(得分:3)
您可以使用正则表达式执行此操作:
<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>
答案 2 :(得分:3)
在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
中的语法不太确定,但你明白了。
链接: