XSD解析报错:a-props-correct.2 属性'ChargeMinimum'默认值'0.00'无效
解决XSD中ChargeMinimum属性默认值的模式验证错误
问题重现
使用以下XSD定义时触发验证报错:
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="Money"> <xs:restriction base="xs:decimal"> <xs:pattern value="\d+\.\d{2}" /> <xs:minInclusive value="0.00" /> <xs:maxInclusive value="9999999.99" /> </xs:restriction> </xs:simpleType> <xs:element name="Document" id="Document"> <xs:complexType> <xs:sequence> <xs:element name="Issue" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:attribute name="ChargeMinimum" use="optional" type="Money" default="0.00" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
报错信息
a-props-correct.2: Invalid value constraint value '0.00' in attribute 'ChargeMinimum'. cvc-pattern-valid: Value '0.0' is not facet-valid with respect to pattern '\\d+.\\d{2}' for type 'Money'.
错误原因
XSD解析器处理属性默认值时,会将0.00自动转换为xs:decimal类型的0.0(小数末尾的零会被省略)。但自定义的Money类型要求值必须匹配\d+\.\d{2}模式——即整数部分至少1位,小数部分固定2位。0.0只有1位小数,不符合模式约束,因此触发验证错误。
解决方案
提供三种可行方案,可根据实际需求选择:
方案1:放宽模式匹配规则
调整Money类型的pattern,允许小数部分为1位或2位,兼容解析器的自动简化行为:
<xs:simpleType name="Money"> <xs:restriction base="xs:decimal"> <xs:pattern value="\d+\.\d{1,2}" /> <xs:minInclusive value="0.00" /> <xs:maxInclusive value="9999999.99" /> </xs:restriction> </xs:simpleType>
方案2:改用字符串类型保留格式
将Money的基础类型从xs:decimal改为xs:string,确保默认值0.00以字符串形式保留,不会被解析器简化:
<xs:simpleType name="Money"> <xs:restriction base="xs:string"> <xs:pattern value="\d+\.\d{2}" /> <!-- 用断言验证数值范围(需XSD 1.1支持) --> <xs:assertion test="xs:decimal($value) >= 0.00 and xs:decimal($value) <= 9999999.99" /> </xs:restriction> </xs:simpleType>
方案3:移除模式约束
如果不需要严格的格式校验,仅保留数值范围限制即可避免错误:
<xs:simpleType name="Money"> <xs:restriction base="xs:decimal"> <xs:minInclusive value="0.00" /> <xs:maxInclusive value="9999999.99" /> <!-- 移除pattern约束 --> </xs:restriction> </xs:simpleType>
内容的提问来源于stack exchange,提问作者A G
相关产品推荐
相关产品推荐

