如何在XSD 1.0中不强制顺序限制特定子元素的出现次数?
能否用XSD 1.0实现指定的子元素约束规则?
需求场景
- 父元素包含多个不同子元素
- 某一子元素最多出现1次
- 某一子元素最多出现2次
- 其余子元素出现次数无限制
- 无法强制子元素的顺序
有效XML示例
<EL A="1"> <SUBA B="1"/><!--最多出现1次--> <SUBB B="1"/><!--最多出现2次--> <SUBC B="1"/> <SUBB B="1"/> <SUBC B="1"/> </EL>
无效XML示例
<EL A="1"> <SUBB B="1"/><!--最多出现2次--> <SUBA B="1"/><!--最多出现1次--> <SUBB B="1"/><!--最多出现2次--> <SUBC B="1"/> <SUBB B="1"/><!--超出次数限制--> <SUBC B="1"/> </EL>
解答
可以用XSD 1.0实现上述规则,但你提供的示例XSD存在多处错误(重复引用子元素、文档注释错误、遗漏子元素等)。正确的实现方式是通过xs:choice并设置maxOccurs="unbounded",同时为每个子元素指定对应的出现次数限制:
- 最多出现1次的子元素设置
maxOccurs="1" - 最多出现2次的子元素设置
maxOccurs="2" - 无次数限制的子元素设置
maxOccurs="unbounded"
以下是修正后的XSD代码:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="EL"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element ref="SUBELA" minOccurs="0" maxOccurs="1"> <xs:annotation> <xs:documentation xml:lang="en"> SubElementA </xs:documentation> </xs:annotation> </xs:element> <xs:element ref="SUBELB" minOccurs="0" maxOccurs="2"> <xs:annotation> <xs:documentation xml:lang="en"> SubElementB </xs:documentation> </xs:annotation> </xs:element> <xs:element ref="SUBELC" minOccurs="0" maxOccurs="unbounded"> <xs:annotation> <xs:documentation xml:lang="en"> SubElementC </xs:documentation> </xs:annotation> </xs:element> </xs:choice> <xs:attribute name="A" use="required"> <xs:annotation> <xs:documentation xml:lang="en"> TaskId </xs:documentation> </xs:annotation> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="32"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="SUBELA"> <xs:complexType> <xs:attribute name="A" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="64"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="SUBELB"> <xs:complexType> <xs:attribute name="A" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="64"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="SUBELC"> <xs:complexType> <xs:attribute name="A" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="64"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> </xs:schema>
内容的提问来源于stack exchange,提问作者Human_BetaRelease
相关产品推荐
相关产品推荐

