限制 XSD 中的特定数字
Restricting specific numbers in XSD
我正在尝试创建一个 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 限制。
据我所知,将范围拆分为包含的所有数字的枚举方法似乎是最有可能实际可行的方法,但它仍然非常难看。
这是关于 XSD 1.1。也许我还没有偶然发现一种完全不同的方法?
编辑:虽然我只是自我回答,但我会把这个问题留到今天,以防有人能想出比...我创造的东西更优雅的东西。 (我不确定是否删除问题 - 如果您认为这没有帮助,请标记它或类似的东西。谢谢。)
自答:
想了一上午都不知道,post这个问题,然后你的大脑立刻想出了一个解决方案...
我没想到实际上可以使用多个 min/maxInclusives,因为我从名称中想到它们会非常独特。好吧,事实并非如此,所以我想出了这个美丽的可憎:
<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>
这正是我想要的通用方法类型。
我正在尝试创建一个 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 限制。
据我所知,将范围拆分为包含的所有数字的枚举方法似乎是最有可能实际可行的方法,但它仍然非常难看。
这是关于 XSD 1.1。也许我还没有偶然发现一种完全不同的方法?
编辑:虽然我只是自我回答,但我会把这个问题留到今天,以防有人能想出比...我创造的东西更优雅的东西。 (我不确定是否删除问题 - 如果您认为这没有帮助,请标记它或类似的东西。谢谢。)
自答:
想了一上午都不知道,post这个问题,然后你的大脑立刻想出了一个解决方案...
我没想到实际上可以使用多个 min/maxInclusives,因为我从名称中想到它们会非常独特。好吧,事实并非如此,所以我想出了这个美丽的可憎:
<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>
这正是我想要的通用方法类型。