Cómo declarar un caso de esquema XML especial (XSD)
Pregunta
Necesito tu ayuda para definir un caso especial en el esquema XML:Una secuencia que contiene dos elementos:'x' e 'y' mientras que:
<x>
El elemento puede aparecer de 0 a veces ilimitadas en la secuencia.<y>
El elemento puede aparecer de 0 a 1 veces en la secuencia.<x>
y<y>
las ubicaciones pueden estar en cualquier lugar, es decir, es posible tener tiempos ilimitados<x>
elemento y luego un solo<y>
elemento, y luego sin consolidar multiplicado por el<x>
elemento.
Ejemplos XML de este problema:
Ejemplo 1
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
Ejemplo #2
<y>stuff</y>
<x>stuff</x>
<x>stuff</x>
Ejemplo #3
<x>stuff</x>
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
¡Gracias!
Solución
Por varias razones, ninguna de las muestras de Yuval, Mo o davidsheldon funciona. Aquí hay uno que lo hace.
<xs:complexType name="myComplexType">
<xs:sequence>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:sequence minOccurs="0">
<xs:element name="y" type="xs:string"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:sequence>
</xs:complexType>
Otros consejos
EDITAR: Como mencionó Alohci, mi solución es incorrecta. Según la especificación, un elemento en xs: todos solo puede aparecer cero o una vez. Disculpe las molestias
Creo que lo que quieres no es una secuencia. Una secuencia define no solo los elementos sino también el orden. Y en su caso el orden puede cambiar. ¿Has probado xs: all?
<xs:complexType name="myComplexType">
<xs:all>
<xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" maxOccurs="1"/>
</xs:all>
</xs:complexType>
Otra aproximación podría ser hacer una secuencia pero marcar la secuencia como maxOccurs="unbounded"
Ha pasado un tiempo desde que usé el esquema, pero creo que las secuencias son su respuesta aquí.
Debe tener un número ilimitado de opciones entre (una x) o (una y seguida de una x).
<xsd:element name="parent">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="x" type="xs:string"/>
<xsd:sequence>
<xsd:element name="y" type="xsd:string" />
<xsd:element name="x" type="xsd:string" />
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
</xsd:element>
No es demasiado complicado. Fuera de mi cabeza, debería ser algo como esto:
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
Dado que cada elemento en XSD es opcional por defecto, este XSD coincidirá con la estructura XML que ha definido, con el elemento y
apareciendo en cualquier lugar antes, después o entre los elementos x
, con una ocurrencia máxima de 1