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

XML模式(XSD)-如何指定父元素以包含至少一个子元素?,xml,xsd,schema,Xml,Xsd,Schema,我有一个XML模式(XSD),它将一个元素定义为强制元素(称之为父元素);比如说,这个父元素有五个子元素,它们都可以是可选的,但至少必须出现一个子元素 如何在xsd中指定这一点 澄清:孩子们是不同的元素和可选的。 比如说 <Parent> <Child1>contents are different to other siblings and arbitrary</Child1> <Child2>can be text, a simpl

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

内容与其他同级不同,并且是任意的
可以是文本、简单元素或其他复杂元素
等等
尽管每个孩子都是可选的,但家长至少需要有一个孩子。

使用minOccurs,例如

<xsd:complexType name="Parent">
  <xsd:sequence>
    <xsd:element minOccurs="1" maxOccurs="5" name="Child" type="q10:string"/>
    </xsd:sequence>
</xsd:complexType>


您可以创建包含所有子元素的替换组。为此,您可以使用
minOccurs
属性指定组中至少有一个元素必须出现在文档中。

始终存在直接方法:

<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>

使用断言(我认为它仅在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>


不完全是我想要的。请看更新的问题,希望能澄清意图。不要认为这会起作用;取代基元素必须以某种方式相互关联或派生;正如我在问题中提到的,我的要素是完全独立的;但是对于很多子元素来说太麻烦了。当您在查看答案(以及大量的谷歌搜索)之后将JAXB转换为Java类时,JAXB会产生糟糕的结果,在xsd中似乎没有简单的构造来指定这一点;麻烦太多了,我选择让验证软件强制执行附加规则(例如至少必须有一个孩子)。