2010-09-27 12 views
8

Questa è una parte del mio schema XMLxsd: Come estendere un tipo con una lista non ordinata di elementi

<xs:complexType name="Friend"> 
    <xs:all> 
     <xs:element name="name" type="xs:string" /> 
     <xs:element name="phone" type="xs:string" /> 
     <xs:element name="address" type="xs:string" /> 
    </xs:all> 
</xs:complexType> 

<xs:complexType name="Coworker"> 
    <xs:all> 
     <xs:element name="name" type="xs:string" /> 
     <xs:element name="phone" type="xs:string" /> 
     <xs:element name="office" type="xs:string" /> 
    </xs:all> 
</xs:complexType> 

Per una migliore manutenibilità, mi piacerebbe avere gli attributi condivisi in un (astratto) di tipo Super o qualcosa di simile. Ma più importante, voglio che tutti gli elementi siano non ordinati e anche opzionali.

È possibile, e qual è il modo migliore per farlo?

risposta

13

Devi limitarti un po ', alcune delle cose che stai cercando di fare non sono possibili in XML Schema.

Supponiamo di introdurre un tipo complesso denominato Person come supertipo di Friend e Coworker. Ecco le opzioni:

  1. Sostituire xs:all con xs:sequence, rimuovere name e phone dai sottotipi, aggiungere al super-tipo, e aggiungere l'ereditarietà. Ora i tuoi elementi devono essere ordinati, ma puoi renderli individualmente opzionali. È illegale per utilizzare xs:all nelle gerarchie di tipi nello schema XML, poiché il processore non può stabilire dove si ferma il modello di contenuto principale e viene avviato il modello di contenuto secondario.
  2. Sostituire xs:all con <xs:choice maxOccurs="unbounded"> in entrambi i tipi e aggiungere l'ereditarietà. Quindi i tuoi elementi diventano di nuovo non ordinati, ma possono ripetersi.

Quindi, in conclusione: dati i nomi dei tipi lassù, direi che le tue esigenze non saranno esattamente soddisfatte. Vorrei fare la prima opzione: insistere su un ordine di elementi arbitrari spesso non è così utile come sembra.

+0

Avevo paura che fosse così. Quindi (1) lo sarà. – Cephalopod

Problemi correlati