XML-схема (XSD) - Как указать родительский элемент, который должен содержать хотя бы один дочерний элемент? - PullRequest
6 голосов
/ 22 марта 2010

У меня есть 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>

Даже если каждый ребенок необязателен, у родителя должен быть хотя бы один ребенок.

Ответы [ 4 ]

5 голосов
/ 22 марта 2010

Всегда есть прямой подход:

<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 голос
/ 29 марта 2014

Используя утверждения (я думаю, что это доступно только в 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>
0 голосов
/ 22 марта 2010

Вы можете создать группу замещения, которая будет включать все ваши дочерние элементы. Для этого вы используете атрибут minOccurs, чтобы указать, что в документе должен присутствовать хотя бы один элемент группы.

0 голосов
/ 22 марта 2010

Использовать minOccurs, например,

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