我有一个XML模式(XSD),它将元素定义为必需元素(称之为父元素);例如,这个父级有五个子元素,它们都可以是可选的,但必须至少有一个子元素。
我如何在xsd中指定它?
澄清:孩子是不同的元素和可选的。 例如。
<Parent>
<Child1>contents are different to other siblings and arbitrary</Child1>
<Child2>can be text, a simple element, or another complex element</Child2>
<Child3>etc.. etc</Child3>
</Parent>
<xs:complexType name="Parent">
<xs:sequence>
<xs:element minOccurs="0" name="Child1" type="xs:string"/>
<xs:element minOccurs="0" name="Child2" />
<xs:element minOccurs="0" name="Child3" />
</xs:sequence>
</xs:complexType>
即使每个孩子都是可选的,父母也需要至少有一个孩子。
答案 0 :(得分:5)
始终有直接的方法:
<xs:complexType name="Parent">
<xs:choice>
<xs:sequence>
<xs:element name="Child1"/>
<xs:element name="Child2" minOccurs="0"/>
<xs:element name="Child3" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element name="Child2"/>
<xs:element name="Child3" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element name="Child3"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
答案 1 :(得分:1)
使用断言(我认为它仅在XSD 1.1中可用)可以执行以下操作:
<xs:element name="Parent">
<xs:complexType>
<xs:sequence>
<xs:element name="Child1" type="xs:string" minOccurs="0"/>
<xs:element name="Child2" minOccurs="0"/>
<xs:element name="Child3" minOccurs="0"/>
</xs:sequence>
<xs:assert test="count(*)>=1"/>
</xs:complexType>
</xs:element>
答案 2 :(得分:0)
使用minOccurs,例如
<xsd:complexType name="Parent">
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="5" name="Child" type="q10:string"/>
</xsd:sequence>
</xsd:complexType>
答案 3 :(得分:0)
您可以创建一个包含所有子元素的替换组。为此,您可以使用minOccurs
属性指定组中必须至少有一个元素出现在文档中。
答案 4 :(得分:0)
<xs:complexType name="Parent">
<xs:choice maxOccurs="unbounded">
<xs:element name="Child1" type="xs:string"/>
<xs:element name="Child2" />
<xs:element name="Child3" />
</xs:sequence>
</xs:complexType>
选择 maxOccurs="unbounded"
(默认情况下为 minOccurs=1
=> 至少有一个孩子)