xml xsd ambiguity

Esquema XML ambiguo



xsd ambiguity (3)

Con sus requisitos (cosas como "Cualquier otra etiqueta no tiene que ajustarse a ninguna definición"), Schematron , que se basa en reglas ("esto debe ser cierto", "que debe ser falso") puede ser una mejor opción. solución que el esquema W3C, que es más "todo debe ser así".

Estoy tratando de producir un esquema XML bastante simple para un XML similar al siguiente:

<messages> <item> <important_tag></important_tag> </item> <item> <important_tag></important_tag> <tag2></tag2> </item> <item> <tag2></tag2> <tag3></tag3> </item> </messages>

La idea es que <important_tag> tendrá una definición específica Y puede o no aparecer en <item> . También puede aparecer más de una vez. Además, puede haber otras etiquetas antes o después de <important_tag> que no puedo nombrar de antemano.

Me gustaría dar una definición específica para <important_tag> . Por ejemplo, defina los atributos que debe contener. Lo que quiero decir es que si la etiqueta_importante está presente, debe ajustarse a mi definición. Cualquier otra etiqueta no tiene que ajustarse a ninguna definición.

Intenté usar el siguiente esquema:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="messages"> <xs:complexType> <xs:sequence> <xs:element ref="item" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="item"> <xs:complexType> <xs:sequence> <xs:element ref="important_tag" minOccurs="0"/> <xs:any minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="important_tag"> <xs:complexType> <xs:simpleContent> ... specific definitions for important_tag ... </xs:simpleContent> </xs:complexType> </xs:element> </xs:schema>

Esto da como resultado un error que dice que el esquema es ambiguo.

El mensaje de error exacto es:

cos-nonambig: ''<xs:element ref="important_tag">'' makes the content model non-deterministic against ''<xs:any>''. Possible causes: name equality, overlapping occurrence or substitution groups.

Estoy usando XML Spy de Altova.

¿Cómo puedo solucionar esto?

Gracias, Dana


Hay un excelente artículo en MSDN que habla sobre cómo diseñar esquemas extensibles, que puede encontrar aquí , le sugiero que lo revise todo, pero específicamente en relación con su punto de vista, explica por qué está obteniendo este error en el punto 2. en "Uso de XML Esquema para diseñar un formato XML facturable "(puede buscar" no determinista "y llegar directamente allí.

Básicamente, una vez que tienes un elemento xs: any, el validador no puede asumir nada sobre los otros elementos hermanos, entonces, es posible que tengas una definición de etiqueta importante que no requiera esos atributos obligatorios y que esos elementos no puedan ser validados


En cuanto al error: ese mensaje de error menciona una línea que no está en el xsd que incluyó, pero estas dos líneas son ambiguas:

<xs:element ref="important_tag" minOccurs="0"/> <xs:any minOccurs="0"/>

El ejemplo más simple para mostrar la ambigüedad es si solo había una <important_tag> :

<important_tag></important_tag>

El problema es que podría interpretarse como una etiqueta "importante" y cero "cualquiera" (que es lo que quería), pero también puede interpretarse como cero "etiqueta_ importante" y una etiqueta "cualquiera". Esto se debe a que la etiqueta "any" puede coincidir con cualquier etiqueta, incluida "important_tag".

He leído que la próxima versión de XML Schema te permite decir lo que quieres decir: cualquier etiqueta, excepto important_tag.

Coincidir con el XML de dos maneras diferentes es similar a la expresión regular "a * a *" que coincide con "a" de dos maneras diferentes (una primero "a", o un segundo "a"). Esta ambigüedad solía llamarse "no determinista" en la especificación XML para DTD, pero la especificación del esquema XML lo llama la regla de atribución de partículas únicas (UPA), lo que significa que debe poder determinar qué parte del esquema obtiene cada parte del documento XML.