这是我的XML:
<animals>
<cat/>
<dog/>
<cat/>
<cat/>
</animals>
<cat/>
和<dog/>
元素可以按任意顺序排列,并且可以有任意数量的元素。但我确实需要确保至少有一个<cat/>
和至少一个<dog/>
。我无法理解我的XSD必须如何。
这就是我的尝试:
<xs:complexType name="animals">
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="cat" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="dog" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
例如,如果没有<cat/>
,则不会显示任何错误。
答案 0 :(得分:1)
使用XSD 1.1,它应该如下:
<xs:complexType name="animals">
<xs:all>
<xs:element name="cat" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="dog" minOccurs="1" maxOccurs="unbounded"/>
</xs:all>
</xs:complexType>
使用XSD 1.0,它有点棘手。
但是,我们可以观察到任何有效的
<animals>
的序列必须以<cat>
或<dog>
元素开头。
第一个元素可能会重复,但有一点,
必须有另一个元素的第一个实例。
因此,这可以选择两种可能的序列。
在我们确保至少有一个<cat>
和一个<dog>
元素之后,
可以有任意数量的附加元素:
<xs:complexType name="animals">
<xs:sequence>
<xs:choice>
<!-- At least one <cat> followed by one <dog> -->
<xs:sequence>
<xs:element name="cat" maxOccurs="unbounded"/>
<xs:element name="dog"/>
</xs:sequence>
<!-- At least one <dog> followed by one <cat> -->
<xs:sequence>
<xs:element name="dog" maxOccurs="unbounded"/>
<xs:element name="cat"/>
</xs:sequence>
</xs:choice>
<!-- Any remaining number of <cat> and <dog> -->
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="cat"/>
<xs:element name="dog"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
对于更复杂的元素类型,建议一次声明元素,
然后在复杂类型中使用<xs:element ref="elementName"/>
。