2011-03-07 17 views
27

Estoy teniendo problemas para entender el comportamiento de la siguiente esquema XML:entendimiento xsd: la elección y minOcurrencias

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="rootnode"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:choice minOccurs="1" maxOccurs="2"> 
      <xsd:element name="e1" minOccurs="1" maxOccurs="2"/> 
      <xsd:element name="e2" minOccurs="0" maxOccurs="1"/> 
     </xsd:choice> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

que esperaba al menos una instancia de alguno de los elementos o <e1><e2> se requerirá como un hijo de <rootnode>. A pesar de mis expectativas, un vacío <rootnode> validará contra este esquema:

> xmllint --schema test.xsd empty.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<rootnode> 
</rootnode> 
empty.xml validates 

Si cambio el atributo de elemento minOccurse2 a algo distinto de "0", consigo el comportamiento que esperaba originalmente.

  • Parece como si la mera ausencia del elemento <e2> cuenta como una ocurrencia del xsd:choice en mi ejemplo.

  • Si este es el caso, entonces ¿cómo es que este número infinito de ocurrencias no infringe el límite de maxOccurs en mi xsd:choice?

Respuesta

81

te digo se puede ir a las tiendas al menos una vez y como máximo dos veces, y cada vez que tiene una opción de qué comprar: se puede comprar manzanas (ya sea una manzana o dos manzanas), o puedes comprar naranjas (ya sea naranjas o naranjas).

Es muy posible que elija ir a las tiendas dos veces y en cada ocasión no compre naranjas. Entonces vuelves sin nada.

+0

@mizo escribe (en una respuesta que eliminé): Dibujé un árbol de decisión de esto, y concluí que la elección puede dar como resultado once secuencias distintas. Si decido "ir de compras" una vez, puedo terminar con e1, e1 e1, nada o e2. Si decido "ir de compras" dos veces, puedo terminar con cualquiera de las cuatro permutaciones anteriores o e1 e1 e1, e1 e2, e1 e1 e1 e1, e1 e1 e2, e2 e1, e2 e1 e1 o e2 e2. ¿Es esto correcto? - mizo hace 6 horas –

+11

Es por eso que como plátanos: hay menos ramas en los plataneros. – Dan

+1

La mejor respuesta que he leído en un momento en SO: claro, conciso, y te hace sonreír en el proceso. Prestigio. – tsemer

1

Aquí son las combinaciones permisibles

Two choices: 
e1 (1 - 2) + e1 (1 - 2) = e1 x (2 - 4), or 
e1 (1 - 2) + e2 (0 - 1), or 
e2 (0 - 1) + e1 (1 - 2), or 
e2 (0 - 1) + e2 (0 - 1) = e2 (0 - 2) 

One choice (but no new outcomes): 
e1 (1-2), or 
e2 (0-1) 


e1e1, e1e1e1, e1e1e1e1 
e1, e1e2, e1e1e2 
e2e1, e2e1e1 
empty, e2, e2e2 

Nota que la elección [min = 2 max = 2] habría producido el mismo conjunto de combinaciones válidas.

+0

Muy bien, así que eso cuenta como once si elimina el duplicado 'e1e1'. Efectivamente, el 'minOccurs' en' choice' no parece tener efecto, si uno de los elementos secundarios tiene 'minOccurs =" 0 "'. – mizo

+0

Derecha, 11 posibilidades únicas. Tenga en cuenta que minOccurs = "1" es el valor predeterminado, por lo que eliminar el atributo no cambia el valor de minOccurs. Incluso cuando configure el minOccurs = 2, el conjunto de combos válidos no debería cambiar. Mientras una de las opciones válidas tenga minOccurs = 0, llego a la conclusión de que los atributos de elección donde minOccurs = maxOccurs producen el mismo conjunto que donde mOccurs