2010-07-24 8 views
30

Tengo siguiente código XSD:Validación XML con XSD: ¿cómo evitar preocuparse por la secuencia de los elementos?

<xsd:complexType name="questions"> 
    <xsd:sequence> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/> 
     <xsd:element name="pictureInput" type="pictureInput" minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

El problema aquí es: la ubicación de los elementos, multipleChoiceInput, etc., deben aparecer en el mismo orden en que se declaran. No quiero que esto suceda, quiero que, en el proceso de validación, la secuencia no sea relevante. ¿Cómo puedo conseguir esto?

Otra posibilidad que hemos probado ha sido:

<xsd:complexType name="questions"> 

     <xsd:choice maxOccurs="unbounded"> 
      <xsd:element name="location" type="location"/> 
      <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="unbounded"/> 
      <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/> 
     </xsd:choice>    

</xsd:complexType> 

En este ejemplo, la secuencia realmente no importa más, y puede tener tantos elementos como quiero (lo que "todos" no permitiría yo para hacer). Pero todavía tengo el problema con el mínimo y el máximo de Ocurrencias. En este ejemplo, podría tener tantos "pictureInput" como sea posible, ¿cuál es la restricción que me gustaría tener 0 o 1.

¡Muchas gracias por ayudarme!

Respuesta

39
<xsd:complexType name="questions"> 
    <xsd:all> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/> 
     <xsd:element name="textInput" type="textInput"/> 
     <xsd:element name="pictureInput" type="pictureInput"/> 
    </xsd:all> 
</xsd:complexType> 

NOTA: He cambiado "secuencia" a "todos" para

fuerzas de secuencia (como se define). si el orden no importa, entonces todo se usa.

Si hay posibilidades de aparición de elementos más de una vez, se puede usar xsd: any.

<xsd:complexType name="questions"> 
    <xsd:sequence> 
     <xsd:any minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

Puede encontrar detalles de xsd: ninguna en siguiente enlace:

http://www.w3schools.com/schema/schema_complex_any.asp

+2

Gracias por responder Yok, pero "todos" no se pueden utilizar en mi caso, la causa "todo" requiere que el elemento aparezca solo UNA VEZ (los eventos mínimo y máximo solo pueden aceptar los valores 0 y 1). – jcborges

+1

Entonces, tal vez '' es tu amigo. – Tomalak

+1

Ya en este caso, cualquiera debe ser utilizado. También actualizará la respuesta. – YoK

16

Estoy un poco tarde para esta discusión, pero no tenía el mismo problema y ha encontrado la solución:

<xsd:complexType name="questions"> 
    <xsd:choice maxOccurs="unbounded"> 
     <xsd:element name="location" type="location"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput"/> 
     <xsd:element name="textInput" type="textInput"/> 
     <xsd:element name="pictureInput" type="pictureInput"/> 
    </xsd:choice> 
</xsd:complexType> 

La clave es combinar xs: choice con maxOccurs = "unbounded". Si solo usa xs: all, tiene permitido uno de cada, punto.

editado para agregar: Mientras xs: any funcionará, no limitará sus elecciones a los cuatro elementos detallados. Permitirá cualquier cosa, lo que prácticamente frustra el propósito de un esquema.

+1

Para mí, este es el mejor enfoque para un problema así, aunque no es perfecto. En este caso, esto no respeta el requisito de tener 0 o 1 "pictureInput" s. Puede agregar más de 1 y la configuración de maxOccurs no puede evitar eso (porque la opción en sí misma está desatada). –

0

También muy tarde a la fiesta aquí, pero sería utilizando <xsd:all> conjuntamente con minOccurs y maxOccurs no funciona ?:

<xsd:complexType name="questions"> 
    <xsd:all> 
     <xsd:element name="location" type="location" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="multipleChoiceInput" type="multipleChoiceInput" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="textInput" type="textInput" minOccurs="0" maxOccurs="1"/> 
     <xsd:element name="pictureInput" type="pictureInput" minOccurs="0" maxOccurs="1"/> 
    </xsd:all> 
</xsd:complexType> 
+1

No, porque dentro de cualquiera no puede definir maxOccurs mayor que 1 – sotix

Cuestiones relacionadas