Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSD限制字符串类型模式中的数字_Xml_Xsd - Fatal编程技术网

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

Xml XSD限制字符串类型模式中的数字,xml,xsd,Xml,Xsd,我想用模式限制字符串类型属性。该属性如下所示: text(x,y,z) for 0 <= x,y,z <= 255 <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]

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

text(x,y,z)
for 0 <= x,y,z <= 255
<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>
无效示例:

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>

然后我想做这样的事情:

text(x,y,z)
for 0 <= x,y,z <= 255
<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种组合


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


谢谢你的回答。不幸的是,我不得不使用XSD1.0,但您的第一个解决方案运行良好,并且比我的好得多。还有一个问题:如果数字允许前导零,那么是否可以通过以下方式缩短:“1?[0-9]?[0-9]| 2[0-4][0-9]| 25[0-5]?当然可以。对我来说,允许06而不是006似乎有点奇怪,但这取决于你。