Es válido tener una 'elección' de 'grupo' los elementos de la hora de definir un Esquema XML (XSD)

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Es válido tener una "elección" o "grupo" de los elementos de la hora de definir un Esquema XML (XSD)

es decir,es la siguiente válida

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:group ref="ReservationGroup" />
      <xs:group ref="CancellationGroup"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

Cuando un mensaje XML puede representar, por ejemplo, una nueva reserva o cancelación de una reserva existente.

Si el mensaje es para una reserva, debe incluir todos los elementos definidos en el ReservationGroup grupo.

Si se trata de una cancelación, debe incluir todos los elementos definidos en el CancellationGroup grupo.

Por alguna razón, mi editor de XML (Eclipse) no le gusta esto, pero no indica por qué.Esto muestra que hay un error en la línea <xs:complexType name="HeaderType"> pero no dice lo que el error es

¿Fue útil?

Solución

Yo no soy XML experto, aunque yo lo uso bastante.Esta no es la manera que me gustaría suelen hacer este tipo de estructura.Yo preferiría una por separado los tipos complejos en lugar de una opción de dos grupos (ver el final de esta respuesta).

Sospecho que el problema es que ReservationGroup y CancellationGroup empezar con el mismo elemento, en cuyo caso se le violan el Componente de Esquema de Restricción:Único de Atribución de Partículas (abajo).

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cos-nonambig

Componente De Esquema De Restricción:Único Atribución De Partículas

Un modelo de contenido debe estar formado tal que durante ·validación· de un elemento de información elemento de la secuencia, la partícula componente contenidos directamente, indirectamente o ·implícitamente· en el mismo con el que intento ·validar· cada elemento de la la secuencia a su vez puede ser el único determinado, sin examinar los el contenido o los atributos de ese elemento, y sin ningún tipo de información acerca de la los elementos en el resto de la de la secuencia.

Nota: Esta restricción reconstruye para el Esquema XML de la equivalente a las restricciones de [XML 1.0 (Segunda Edición)] y SGML.Dada la la presencia de un elemento de sustitución los grupos y los comodines, la concisa la expresión de esta restricción es difícil, véase el Análisis de la Única Restricción De Atribución De Partículas (no normativo) (§H) para más discusión.

Por ejemplo, los dos grupos son ilegales en la misma elección, porque cada uno de su primer elemento es "nombre", que significa que usted no puede identificar a qué grupo estás buscando.Sin embargo, es el primer elemento de ReservationGroup es diferente de la Cancelación de grupo (resDate y cancDate tal vez), entonces el que es válido.

Editar: Nunca me había encontrado con este tipo de problema antes, y creo que es fascinante que las definiciones de los grupos son totalmente legales, pero si los ponen juntos en una elección, la elección se convierte en ilegal debido a la definición de cada grupo.

Los grupos que no pueden formar una elección legal

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

Los grupos que se pueden formar una elección legal

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="resDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="cancDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

Como he mencionado anteriormente, me gustaría hacer este tipo de cosas con tipos complejos.Sí, se añade otro elemento, pero parece que la manera obvia y me gusta evidencia.

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:element name="reservation" type="ReservationType" />
      <xs:element name="cancellation" type="CancellationType" />
    </xs:choice>
  </xs:sequence>
</xs:complexType>

Otros consejos

Sí.Fue debido a que tanto el ReservationGroup y la CancellationGroup tenía el mismo primer elemento de una reserva de tipo "elemento con un valor fijo de "Reserva" en el ReservationGroup y "Cancelación" en el Cancellationgroup respectivamente.

Si esto es válido depende del contenido de los grupos:si son de "secuencia" o de la "elección" del modelo de grupos, es perfectamente legal;'todos' modelo de los grupos son las más problemáticas y generalmente no se permite en este caso.

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