È possibile nel linguaggio XML Schema (XSD) del W3C consentire a una serie di elementi di essere in qualsiasi ordine ma limitare comunque le occorrenze?

StackOverflow https://stackoverflow.com/questions/104248

  •  01-07-2019
  •  | 
  •  

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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top