XSD中基于xs:decimal的自定义类型是否允许空值?如何配置?
关于XSD自定义decimal类型的空值/Null支持问题
1. 当前定义是否允许空值/Null?
不允许。你现在的abc类型是基于xs:decimal的限制类型,而xs:decimal作为内置简单类型,默认只接受有效的十进制数值,既不允许空字符串(""),也不支持XML标准的null(通过xsi:nil="true"标识的空状态)。你的restriction块里没有添加任何支持空值的配置,所以这个类型只能接受合法的十进制数字。
2. 如何修改以支持空值/Null?
根据你需要支持的“空值”具体类型(XML Null 或 空字符串),有两种常见的修改思路:
方式一:支持XML Null(xsi:nil="true")
如果你希望使用该类型的元素可以标记为“存在但无值”,不需要修改abc类型本身,只需在元素定义时添加nillable="true"属性:
<xs:element name="myDecimalElement" type="abc" nillable="true"/>
这样该元素既可以填入符合abc类型的十进制值,也可以写成:
<myDecimalElement xsi:nil="true"/>
方式二:让类型本身支持空字符串或Null
如果你希望类型本身能直接接受空字符串或者XML Null,可以使用xs:union将abc类型与空相关的类型结合:
仅支持XML Null的类型定义:
<xs:simpleType name="abc"> <xs:union memberTypes="xs:decimal xs:null"/> </xs:simpleType>
仅支持空字符串的类型定义:
<xs:simpleType name="abc"> <xs:union memberTypes="xs:decimal"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="0"/> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType>
同时支持XML Null和空字符串:
<xs:simpleType name="abc"> <xs:union memberTypes="xs:decimal xs:null"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="0"/> </xs:restriction> </xs:simpleType> </xs:union> </xs:simpleType>
小提示
xsi:nil="true"和空字符串是两个不同的概念:前者表示元素“存在但无值”,后者表示元素的值是一个空字符串,需要根据业务需求选择合适的方式。xs:union是扩展简单类型、让它支持多类型(包括空相关类型)的常用手段,适合需要在类型层面统一支持空值的场景。
内容的提问来源于stack exchange,提问作者Naveen Ajjappa
相关产品推荐
相关产品推荐

