能否为XML Schema中同一元素设置差异化枚举约束?
需求实现方案
这个需求完全可以实现,核心是不要复用同一个全局的color元素定义,而是在两个<sequence>里分别定义color元素,并为它们指定不同的类型约束:
修改后的XML Schema定义
<xs:element name="food"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:sequence id="vegetables"> <xs:element ref="name"/> <xs:element minOccurs="0" ref="texture"/> <xs:element ref="image"/> <!-- 蔬菜的color使用枚举类型约束 --> <xs:element name="color"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="red"/> <xs:enumeration value="orange"/> <xs:enumeration value="green"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> <xs:sequence id="fruit"> <xs:element ref="description"/> <xs:element ref="seeds"/> <!-- 水果的color使用纯字符串类型(自由文本) --> <xs:element name="color" type="xs:string"/> </xs:sequence> </xs:choice> </xs:complexType> </xs:element> <!-- 补充原Schema中引用的其他全局元素定义示例 --> <xs:element name="name" type="xs:string"/> <xs:element name="texture" type="xs:string"/> <xs:element name="image" type="xs:string"/> <xs:element name="description" type="xs:string"/> <xs:element name="seeds" type="xs:string"/>
关键说明
- 蔬菜序列里的
color元素内嵌了枚举类型定义,限制值只能是red、orange、green三者之一。 - 水果序列里的
color元素直接使用xs:string类型,允许任意文本内容。 - 这种方式下,虽然元素名称都是
color,但它们属于各自序列的局部定义,拥有独立的约束规则,完全满足你的需求。
你提供的XML示例可以通过这个Schema的校验:蔬菜的<color>Orange</color>符合枚举约束,水果的<color>It depends</color>作为自由文本也能通过校验。
内容的提问来源于stack exchange,提问作者jmwink
相关产品推荐
相关产品推荐

