2010-03-22 19 views
5

Ho uno schema XML (XSD) che definisce un elemento come obbligatorio (chiamalo padre); questo genitore ha, diciamo, cinque elementi figli, che possono essere tutti facoltativi, MA ALMENO deve verificarsi un elemento figlio.XML Schema (XSD) - Come specificare l'elemento genitore per contenere almeno un elemento figlio?

Come posso specificarlo in xsd?

Per chiarire: I bambini sono elementi diversi e facoltativi. Ad esempio.

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

Anche se ogni bambino è facoltativo, il genitore deve avere almeno un figlio.

+0

Dopo aver esaminato le risposte (e molto di Google), sembra che non ci sia un costrutto facile in xsd per specificarlo; Più problemi di quanti ne valga la pena, ho deciso di lasciare che il software di validazione imponga regole aggiuntive (come ad esempio Almeno un bambino deve verificarsi). – joedotnot

risposta

4

C'è sempre l'approccio diretto:

<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

L'approccio diretto probabilmente funzionerebbe; ma diventa troppo ingombrante per molti elementi figlio. – joedotnot

+0

JAXB sta generando un cattivo risultato quando lo si trasforma in classe Java –

0

Utilizzare minOccurs, ad es.

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

Non proprio quello che intendevo. Si prega di consultare la domanda aggiornata che si spera chiarisca l'intento. – joedotnot

0

È possibile creare un gruppo di sostituzione che incorpori tutti gli elementi figlio. Per questo si utilizza l'attributo minOccurs per specificare che almeno un elemento del gruppo deve essere presente nel documento.

+0

Non penso che funzionerà; gli elementi del gruppo di sostituzione devono essere in qualche modo correlati o derivati ​​l'uno dall'altro; i miei elementi sono totalmente indipendenti come accennato nella mia domanda. – joedotnot

0

Utilizzando asserzioni (penso che sia disponibile solo in XSD 1.1) è possibile effettuare le seguenti operazioni:

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