XML Schema(XSD) - 如何指定父元素包含至少一个子元素?

时间:2010-03-22 07:43:33

标签: xml xsd schema

我有一个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>

即使每个孩子都是可选的,父母也需要至少有一个孩子。

5 个答案:

答案 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 => 至少有一个孩子)