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!

¿Fue útil?

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

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