基于xs:ID定义纯数字唯一ID类型时XML校验报错咨询
报错原因
xs:ID类型的底层数据格式是NCName(无冒号名称),XML规范对NCName的强制要求是首字符必须是英文字母或下划线,不能以数字、英文句号等字符开头,你当前maso的值是纯数字1,不符合NCName的格式要求,所以校验失败。
解决方案
这里提供两种适配不同需求的解决方式:
方案1:坚持使用xs:ID类型
需要同时调整XSD规则和XML的maso取值格式,给ID值加固定前缀避免数字开头:
- 修改XSD的maso类型定义,调整pattern适配带前缀的格式:
<xs:simpleType name="maso_Type"> <xs:restriction base="xs:ID"> <xs:pattern value="ID_[0-9]+"/> </xs:restriction> </xs:simpleType>
- 修改XML中所有
maso的取值,加统一前缀,比如<maso>ID_1</maso>即可通过校验。
方案2:保留纯数字maso格式,用unique约束实现唯一性
如果不想修改现有XML的纯数字maso取值,可以放弃xs:ID,改用xs:integer定义maso类型,同时在XSD的根节点定义中添加全局唯一约束,一样可以实现maso值全局不重复的效果:
- 先修改maso的类型定义为integer:
<xs:simpleType name="maso_Type"> <xs:restriction base="xs:integer"> <xs:pattern value="[0-9]+"/> </xs:restriction> </xs:simpleType>
- 在XSD的
cuahang根元素定义中添加unique约束:
<xs:element name="cuahang"> <xs:complexType> <!-- 此处保留你原本cuahang的内部节点结构定义 --> </xs:complexType> <!-- 新增maso全局唯一约束 --> <xs:unique name="unique_maso"> <xs:selector xpath=".//sach/maso"/> <xs:field xpath="."/> </xs:unique> </xs:element>
这种方案不需要调整现有XML的内容,也能满足maso值全局唯一的需求,适配性更强。
内容的提问来源于stack exchange,提问作者linh128
相关产品推荐
相关产品推荐

