关于xsd:sequence与xsd:element的minOccurs/maxOccurs用法疑问
问题
我先理解了两个XSD示例:
第一个微软示例的Schema:
<xs:element name="zooAnimals"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element name="elephant"/> <xs:element name="bear"/> <xs:element name="giraffe"/> </xs:sequence> </xs:complexType> </xs:element>
这个sequence是可选的,所以其下所有元素可以出现或不出现。
第二个Schema:
<xs:element name="zooAnimals"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element name="elephant" minOccurs="0" maxOccurs="1"/> <xs:element name="bear" minOccurs="1" maxOccurs="unbounded"/> <xs:element name="giraffe" minOccurs="1" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element>
如果zooAnimals元素存在,那么bear和giraffe元素必须存在,这部分我理解。
但遇到下面这种情况时我有疑问:
<xs:element name="zooAnimals"> <xs:complexType> <xs:sequence minOccurs="1" maxOccurs="1"> <xs:element name="elephant" minOccurs="1" maxOccurs="1"/> <xs:element name="bear" minOccurs="0" maxOccurs="1"/> <xs:element name="giraffe" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:element>
既然这个sequence是必填的(minOccurs="1"),为什么还要在元素上指定minOccurs,而且部分元素的minOccurs设为0?
解答
- sequence的
minOccurs="1"只要求这个序列整体必须出现一次,但序列内部的元素可以有各自的出现规则,两者控制的范围完全不同:- sequence的规则管的是「整个元素组要不要出现、能出现几次」
- 内部元素的minOccurs管的是「在这个序列里,该元素要不要出现、能出现几次」
- 回到这个例子,sequence必填意味着:zooAnimals里必须有这个包含elephant、bear、giraffe的序列结构,但序列里的内容可以是以下四种合法情况:
- 只包含elephant
- elephant + bear
- elephant + giraffe
- elephant + bear + giraffe
如果不给bear和giraffe设minOccurs="0",默认是minOccurs="1",那序列里就必须同时存在三个元素,这显然不是想要的约束逻辑。
- 另外,给elephant设minOccurs="1"是明确强调它必须出现(虽然默认值也是1,但显式写出能让Schema的约束逻辑更清晰,避免看的人误解是疏忽没写),而bear和giraffe设为0就是明确允许它们可选出现。
内容的提问来源于stack exchange,提问作者Jean-Philippe
相关产品推荐
相关产品推荐

