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

时间:2015-12-01 09:43:13

标签: xml xsd

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

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种组合。

是否有其他可能性将数字限制为字符串类型中的最大值和最小值,而不是限制每个数字并将所有可能性与&#34;或&#34;?

组合在一起?

1 个答案:

答案 0 :(得分:0)

在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)"/>