XSD 限制字符串类型模式中的数字

XSD restricting numbers in a string type pattern

我想用模式限制字符串类型的属性。该属性如下所示:

text(x,y,z)
for 0 <= x,y,z <= 255

因此括号内的 3 个数字必须限制为最大值 255。

有效示例:

text(24,0,255)

无效示例:

text(15,635,5)

我已经试过了,但是没用:

<xs:restriction base="xs:string">
    <xs:pattern value="text\([0-255],[0-255],[0-255]\)"/>
</xs:restriction>

然后我想到了这样做:

<xs:restriction base="xs:string">
    <xs:pattern value="text\(1?[0-9][0-9],1?[0-9][0-9],1?[0-9][0-9]\)|text\(2[0-4][0-9],1?[0-9][0-9],1?[0-9][0-9]\)|text\(25[0-5],1?[0-9][0-9],1?[0-9][0-9]\)|..."/>
</xs:restriction>

但是由于这 3 个数字中的每一个都有 3 种可能,所以会有 27 种组合。

除了限制每个数字并将所有可能性与 "or" 结合起来之外,是否还有其他可能将数字限制为字符串类型中的最大值和最小值?

在 XSD 1.0 中,正则表达式是唯一可用的解决方案。正如您所发现的,它变得非常讨厌,但是可以做到。我看到的一个巧妙的技巧是使用实体引用构建可重用的正则表达式片段:

<!ENTITY n255 "[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]">

<xs:pattern value="text\(&n255;,&n255;,&n255;\)"/>

我想我也遇到了一个工具,可以自动生成正则表达式以匹配给定范围内的整数,但我不记得在哪里。

在 XSD 1.1 中,将正则表达式与断言相结合可能会更好:

<xs:pattern value="text\([0-9]+,[0-9]+,[0-9]+)"/>
<xs:assertion test="every $t in tokenize(substring-before(substring-after($value, '('), ')'), ',') satisfies (number($t) ge 0 and number($t) le 255)"/>