【问题标题】:XSD restricting numbers in a string type patternXSD 限制字符串类型模式中的数字
【发布时间】:2015-12-01 09:43:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答。不幸的是,我必须使用 XSD 1.0,但您的第一个解决方案运行良好,并且比我的要好得多。还有一个问题:如果数字允许前导零,那么以下是否可以使其更短:“1?[0-9]?[0-9]|2[0-4][0-9]| 25[0-5]" ?
    • 当然。允许 06 而不允许 006 对我来说似乎有点奇怪,但这取决于你。
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多