È possibile nel linguaggio XML Schema (XSD) del W3C consentire a una serie di elementi di essere in qualsiasi ordine ma limitare comunque le occorrenze?
Domanda
Conosco all
e choice
, ma non tengono conto di un caso in cui desidero che alcuni elementi possano verificarsi più di una volta, come ad esempio:
<Root>
<ThingA/>
<ThingB/>
<ThingC/>
<ThingC/>
<ThingC/>
</Root>
Potrei usare sequence
, ma preferirei consentire a questi bambini di essere in qualsiasi ordine. Potrei usare any
, ma non potrei averne più di uno ThingC
. Potrei usare ThingA
, ma poi non potrei limitare ThingB
e <=> a 0 o 1.
Penso di aver letto da qualche parte che ciò era difficile o impossibile in XSD, ma potrebbe essere possibile con RELAX NG. Purtroppo non ricordo dove l'ho letto.
Grazie per l'aiuto!
Soluzione
Esatto: non puoi fare quello che vuoi fare nello schema XML, ma puoi farlo in RELAX NG con:
<element name="Root">
<interleave>
<element name="ThingA"><empty /></element>
<element name="ThingB"><empty /></element>
<oneOrMore><element name="ThingC"><empty /></element></oneOrMore>
</interleave>
</element>
Le tue opzioni nello schema XML sono:
- aggiungi una fase di preelaborazione che normalizza il tuo XML di input in un ordine particolare, quindi usa
<xs:sequence>
- usa
<xs:choice>
e aggiungi ulteriore convalida (ad esempio usando Schematron) per verificare che non ci sia più di un<ThingA>
o<ThingB>
- decidi di correggere l'ordine degli elementi nel tuo linguaggio di markup
Si scopre che la terza è di solito l'opzione migliore; di solito non c'è molto costo per i generatori di XML per produrre elementi in un ordine particolare, e non solo aiuta la validazione ma aiuta anche il consumo dell'XML se l'ordine può essere conosciuto in anticipo.