You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:27:47