SEPA XSD空枚举与最小长度冲突问题咨询
XSD类型约束冲突问题分析
相关XSD代码
<xs:simpleType name="ExternalPurpose1Code"> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:maxLength value="4"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="ExternalPurpose1Code_EPC121-16_2023_V1.0_SCT_Inst_C2P"> <xs:restriction base="ExternalPurpose1Code"> <xs:enumeration value=""/> </xs:restriction> </xs:simpleType>
问题说明
用户疑问:使用派生类型ExternalPurpose1Code_EPC121-16_2023_V1.0_SCT_Inst_C2P时,它允许空值但基类型不允许,最终约束是什么?
xmllint报错信息(中文翻译)
pain.001.001.09.xsd:882: element enumeration: 模式解析错误 : 元素 '{http://www.w3.org/2001/XMLSchema}enumeration': [约束'minLength'] 值的长度为'0';低于允许的最小长度'1'。 pain.001.001.09:882: element enumeration: 模式解析错误 : 元素 '{http://www.w3.org/2001/XMLSchema}enumeration': 约束的值''无法通过基类型'{urn:iso:std:iso:20022:tech:xsd:pain.001.001.09}ExternalPurpose1Code'的验证。 WXS 模式 pain.001.001.09.xsd 编译失败
结论
这个XSD是无效的,根本无法完成编译解析,不存在所谓的“最终约束”。原因很明确:
- 基类型
ExternalPurpose1Code强制要求字符串长度至少为1(minLength="1") - 派生类型里添加的枚举值是空字符串,完全不符合基类型的长度要求
- XSD规则明确:派生类型的所有约束必须兼容基类型约束,不能冲突,因此验证器直接报错拒绝编译
要解决这个问题,二选一即可:
- 修改基类型,移除
minLength="1"约束,允许空字符串 - 把派生类型里的空枚举值替换成长度在1-4之间的有效字符串
内容的提问来源于stack exchange,提问作者Faizan Khalid
相关产品推荐
相关产品推荐

