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>
5 Réponses :
Utilisez des minocommunis, par exemple
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.
Vous pouvez créer un groupe de substitution qui intègre tous vos éléments enfants. Pour cela, vous utilisez l'attribut minococurs code> pour spécifier qu'au moins un élément du groupe doit se produire dans le document. P>
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.
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>
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
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>
<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)
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).