2011-07-06 8 views
6

¿Es posible hacer algo como esto en un esquema XML?¿El esquema XML puede tener múltiples opciones en un solo complexType?

<xsd:complexType name="ItemsType"> 
    <xsd:choice minOccurs="0" maxOccurs="unbounded"> 
    <xsd:element ref="shirt"/> 
    <xsd:element ref="hat"/> 
    <xsd:element ref="umbrella"/> 
    </xsd:choice> 
    <xsd:choice minOccurs="1" maxOccurs="3"> 
    <xsd:element ref="apple"/> 
    <xsd:element ref="banana"/> 
    <xsd:element ref="strawberry"/> 
    </xsd:choice> 
</xsd:complexType> 

esto es aparentemente inválido sin embargo. Lo que me gustaría es que sea posible tener 0 o más de la primera opción. Por ejemplo, E.g. podría haber un elemento de camisa y un elemento de sombrero, o tal vez nada de elementos de ropa (desde minOccurs = "0"), seguido de al menos 1 elemento de fruta (quiero hacerlo de modo que tenga que haber al menos uno, ya que minOccurs = "1").

¿hay alguna manera de hacerlo?

Gracias por cualquier ayuda.

+1

Parece válida para mí; ¿Simplificaste el ejemplo y ocultaste un problema por error? Esto se volvería inválido si la segunda opción contiene un elemento que también aparece en la primera opción ... – xcut

Respuesta

11

<xsd:complexType> espera tener solo un elemento secundario. Envuelva sus dos opciones dentro de un solo <xsd:sequence>.

Ejemplo

<xsd:complexType name="ItemsType"> 
    <xsd:sequence> 
    <xsd:choice minOccurs="0" maxOccurs="unbounded"> 
     ... clothes ... 
    </xsd:choice> 
    <xsd:choice minOccurs="1" maxOccurs="3"> 
     ... fruits ... 
    </xsd:choice> 
    </xsd:sequence> 
</xsd:complexType> 
+0

¡Ya veo, muchas gracias! – Jimmy

+0

@jasso Pero eso requiere que la elección de la ropa se especifique antes de la elección de la fruta en el xml, ¿verdad? ¿Hay alguna manera de no requerir ese pedido? –

+0

@DavidDoria La primera solución que me viene a la mente es crear un duplicado de la secuencia que solo tiene el orden de los contenidos intercambiados, luego envolver esas dos secuencias dentro de un elemento de elección. En general, en tal caso, probablemente deba usar grupos para simplificar el código. También en este caso, debe tener cuidado de no hacer que la estructura sea no determinista, ya que la opción de vestir es opcional. Esto puede resolverse haciendo obligatoria la elección de la ropa si aparecen primero y opcional en la secuencia intercambiada donde las frutas aparecen primero. – jasso

Cuestiones relacionadas