Construcción de esquema XML para "uno o más de estos elementos, pero debe ser al menos uno"

StackOverflow https://stackoverflow.com/questions/100228

  •  01-07-2019
  •  | 
  •  

Pregunta

Estoy intentando configurar parte de un esquema que es como una "Secuencia" donde todos los elementos secundarios son opcionales, pero al menos uno de los elementos debe estar presentes y podría haber más de uno.

Intenté hacer lo siguiente, pero XMLSpy se queja de que "El modelo de contenido contiene los elementos <element name="DateConstant"> y <element name="DateConstant"> que no se pueden determinar de forma única":

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

Se puede hacer esto? Y si se puede, cómo)?

Algunas aclaraciones:Solo quiero permitir uno de cada elemento con el mismo nombre.Puede haber una "Constante de fecha" y/o una "Constante de tiempo", pero no dos de ninguna de las dos.La respuesta de Gizmo coincide con mis requisitos, pero no es práctica para una mayor cantidad de elementos.La respuesta de Hurst permite dos o más elementos con el mismo nombre, lo cual no quiero.

¿Fue útil?

Solución

Prueba esto:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

Al hacerlo, obligas a elegir el primer elemento y luego el resto es opcional, o el segundo elemento y el resto es opcional, o el tercer elemento.

Esto debería hacer lo que quieres, espero.

Por supuesto, puedes colocar las subsecuencias en grupos, para evitar duplicar un elemento en cada secuencia si te das cuenta de que te falta uno.

Otros consejos

Según el artículo técnico de MSDN titulado Comprender el esquema XMLen http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5Puedes aprovechar restricciones como minOcurre sobre la definición de elección (compositor) en sí:

"El uso de restricciones de ocurrencia en un compositor se aplica a todo el grupo en su conjunto"

(Vea el ejemplo más sofisticado que utiliza tipos complejos anidados y el ejemplo de AuthorType)

Usted indicó que su requisito es "al menos uno de los elementos debe estar presente y podría haber más de uno".Por ello, te propongo que pruebes lo siguiente:

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

@hurst,

Desafortunadamente no has entendido la pregunta original.Colocar minOccurs="1" en la elección se cumple automáticamente cuando TODOS los elementos que tienen minOccurs="0" están contenidos como opciones.

Por lo tanto, no ha tenido en cuenta "al menos uno" requerido por el cartel original, porque ningún elemento satisface correctamente una aparición de dos elementos completamente opcionales.

Hasta ahora no puedo encontrar una solución a esto ya que minOccur/maxOccur se relacionan con el grupo en el que están definidos y NO se relacionan con un número total de nodos.Tampoco puede utilizar el elemento de elección para definir el mismo elemento con nombre más de una vez o se volverá "ambiguo".He visto algunos ejemplos que utilizan referencias en lugar de elementos de un tipo específico, pero creo que esto falla en el analizador XSD de Microsoft.

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

Aquí puede ver que tiene la primera secuencia (que DEBE tener Elem1 pero puede tener Elem2 opcionalmente), o tiene la segunda secuencia (que DEBE tener Elem2).

Por lo tanto, ahora tiene "uno o más" de estos 2 elementos.Por supuesto, esto se vuelve exponencialmente más complejo cuantas más opciones tenga, ya que necesita proporcionar opciones adicionales para todas las combinaciones posibles.

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