7
votes

Schema XML (XSD) - Comment spécifier l'élément parent pour contenir au moins un élément enfant?

J'ai un schéma XML (XSD) qui définit un élément comme obligatoire (appelez-le le parent); Ce parent a, disons que cinq éléments enfants, qui peuvent tous être facultatifs, mais au moins un élément enfant doit se produire.

Comment puis-je préciser cela dans le XSD? P>

Pour clarifier: les enfants sont des éléments différents et optionnels. Par exemple. P>

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


1 commentaires

Après avoir examiné les réponses (et beaucoup de googling), il semble qu'il n'ya pas de construction facile dans le XSD de spécifier cela; Plus de problèmes que cela vaut la peine, j'ai choisi de laisser le logiciel de validation appliquer des règles supplémentaires (comme au moins un enfant doit avoir lieu).


5 Réponses :


0
votes

Utilisez des minocommunis, par exemple xxx


1 commentaires

Pas tout à fait ce que j'ai voulu. S'il vous plaît voir la question mise à jour qui, espérons-le, clarifie l'intention.



0
votes

Vous pouvez créer un groupe de substitution qui intègre tous vos éléments enfants. Pour cela, vous utilisez l'attribut minococurs pour spécifier qu'au moins un élément du groupe doit se produire dans le document.


1 commentaires

Ne pensez pas que cela fonctionnera; Les éléments de groupe de substitution doivent en quelque sorte être liés ou dérivés les uns des autres; Mes éléments sont totalement indépendants comme mentionnés dans ma question.



5
votes

Il y a toujours l'approche directe:

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


2 commentaires

Approche directe fonctionnerait probablement; Mais devient trop encombrant pour beaucoup d'éléments d'enfants.


Jaxb génère un mauvais résultat lorsque vous le transformez en classe Java



3
votes

Utilisation d'assertions (je pense qu'il est uniquement disponible dans XSD 1.1) Il est possible de procéder aux éléments suivants:

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

1
votes
<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>
Putting the maxOccurs="unbounded" to the choice (minOccurs=1 by default => at least one child)

0 commentaires