¿Es posible en el lenguaje de esquema XML (XSD) del W3C permitir que una serie de elementos estén en cualquier orden pero aun así limitar las apariciones?

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Se acerca de all y choice, pero no tienen en cuenta un caso en el que quiero que algunos elementos puedan ocurrir más de una vez, como por ejemplo:

<Root>
    <ThingA/>
    <ThingB/>
    <ThingC/>
    <ThingC/>
    <ThingC/>
</Root>

Podría usar sequence, pero preferiría permitir que estos niños estén en cualquier orden.Podría usar any, pero entonces no podría tener más de uno ThingC.Podría usar choice, pero luego no pude limitar ThingA y ThingB a 0 o 1.

Creo haber leído en alguna parte que esto era difícil o imposible en XSD, pero podría ser posible con RELAX NG.Desafortunadamente no recuerdo dónde leí eso.

¡Gracias por cualquier ayuda!

¿Fue útil?

Solución

Así es:No puedes hacer lo que quieres en XML Schema, pero puedes hacerlo en 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>

Sus opciones en el esquema XML son:

  • agregue un paso de preprocesamiento que normalice su XML de entrada en un orden particular y luego use <xs:sequence>
  • usar <xs:choice>, y agregue validación adicional (por ejemplo, usando Schematron) para verificar que no haya más de uno <ThingA> o <ThingB>
  • decide arreglar el orden de los elementos en tu lenguaje de marcado

Resulta que la tercera suele ser la mejor opción;Por lo general, los generadores de XML no tienen mucho costo para generar elementos en un orden particular, y no solo ayuda a la validación sino que también ayuda al consumo del XML si el orden se puede conocer de antemano.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top