xml xsd schema choice

¿Es válido tener una "elección" de elementos de "grupo" al definir un Esquema XML(XSD)?



schema choice (3)

No soy un experto en XML, aunque lo uso bastante. Esta no es la forma en que generalmente haría este tipo de estructura. Preferiría un tipo complejo separado en lugar de una elección de dos grupos (ver el final de esta respuesta).

Sospecho que el problema es que ReservationGroup y CancellationGroup comienzan con el mismo elemento, en cuyo caso violarás la Restricción del componente de esquema: Atribución única de partículas (a continuación).

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

Restricción del componente de esquema: Atribución única de partículas

Un modelo de contenido debe formarse de modo que durante la validación de una secuencia de elemento de información de elemento, el componente de partícula contenido directa, indirectamente o implícitamente con el que intentar validar cada elemento de la secuencia a su vez pueda determinarse de forma única sin examinar el contenido o los atributos de ese elemento, y sin ninguna información sobre los elementos en el resto de la secuencia.

Nota: esta restricción reconstruye para XML Schema las restricciones equivalentes de [XML 1.0 (Second Edition)] y SGML. Dada la presencia de grupos de sustitución de elementos y comodines, la expresión concisa de esta restricción es difícil, ver Análisis de la restricción de atribución de partículas única (no normativa) (§H) para mayor discusión.

Por ejemplo, los dos grupos a continuación son ilegales en la misma opción, porque cada uno de sus primeros elementos es "nombre", lo que significa que no puede identificar qué grupo está mirando. Sin embargo, el primer elemento de ReservationGroup es diferente del grupo de cancelación (resDate y cancDate tal vez), y luego eso es válido.

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

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>

Grupos que 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 mencioné anteriormente, haría este tipo de cosas con tipos complejos. Sí, agrega otro elemento, pero parece la forma obvia y me gusta la obviedad.

<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>

¿Es válido tener elementos de "elección" o "grupo" al definir un esquema XML (XSD)?

es decir, es el siguiente válido

<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>

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

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

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

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


Sí. Fue porque tanto el Grupo de reserva como el Grupo de cancelación tenían el mismo primer elemento: un elemento de "reserva" con un valor fijo de "Reserva" en el Grupo de reserva y "Cancelación" en el Grupo de cancelación, respectivamente.


Si esto es válido depende del contenido de los grupos: si son grupos de ''secuencia'' o ''elección'', es perfectamente legal; ''todos'' los grupos de modelos son más problemáticos y generalmente no están permitidos en este caso.