如何编写匹配xs:float与字符串"exist"的合法XSD限制模式?
原有规则失效原因
你写的校验规则无法生效,核心问题有3个:
- XSD正则语法不支持用单引号包裹固定字符串的写法,
'exist'会把单引号作为待匹配字符,无法匹配到不带单引号的exist值 - 正则片段
[0-9]仅能匹配单个0-9数字,完全覆盖不了xs:float支持的正负号、小数点、科学计数法等合法格式 - 你写的基类型
xs:String拼写错误,XSD内置字符串类型为全小写的xs:string
正确实现方案
XSD不支持在单个restriction里直接声明「值为某基础类型或某固定字符串」的规则,推荐使用xs:union做类型联合实现,逻辑最严谨,不会漏校验规则:
推荐写法:联合内置浮点类型与字符串枚举
直接复用XSD内置的xs:float校验逻辑处理浮点值,额外加固定字符串的枚举校验即可,不需要自己手写容易出错的浮点匹配正则:
<!-- 定义自定义联合类型 --> <xs:simpleType name="floatOrExistType"> <xs:union memberTypes="xs:float"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="exist" /> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType> <!-- 属性声明时直接引用该自定义类型即可 --> <xs:attribute name="targetAttr" type="floatOrExistType" />
该校验逻辑会自动按顺序匹配:值如果符合xs:float格式就直接通过,不符合的话再判断是否等于固定字符串exist,满足任意一个条件就算校验通过,完全匹配需求。
可选写法:纯pattern正则实现(不推荐)
如果你的场景必须用单pattern的restriction实现,需要写全合法浮点值的匹配规则,去掉多余的单引号:
<xs:simpleType name="floatOrExistByPattern"> <xs:restriction base="xs:string"> <xs:pattern value="(\+|-)?([0-9]+(\.[0-9]*)?|\.[0-9]+)([eE](\+|-)?[0-9]+)?|exist"/> </xs:restriction> </xs:simpleType>
注意:该正则仅能匹配常规浮点数字格式,和XSD内置
xs:float支持的特殊值(INF、-INF、NaN)不完全匹配,如果不需要拦截这些特殊浮点值,优先选择第一种union写法。
内容的提问来源于stack exchange,提问作者NET PERFECTDEV
相关产品推荐
相关产品推荐

