2008-12-22 22 views
7

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

<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 puede no aparecer bajo <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 etiqueta_importante está presente, debe cumplir con mi definición. Cualquier otra etiqueta no tiene que ajustarse a ninguna definición.

He intentado utilizar 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 se traduce en un error diciendo que el esquema es ambigua.

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 soluciono esto?

Gracias, Dana

+0

¿Puede por favor publicar el mensaje de error exacto que está recibiendo y qué herramientas utilizó? – Tomalak

Respuesta

6

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

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

El ejemplo más simple para mostrar la ambigüedad es que si sólo había uno <important_tag>:

<important_tag></important_tag> 

El problema es que podría ser interpretado como una "important_tag" y "ninguna" etiquetas cero (que es lo que quería), pero también se puede interpretar como "important_tag" cero y uno "cualquier" etiqueta 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 le permite decir lo que quiere 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 primera "a" o una segunda "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.

+1

Tienes razón, ese era el problema exacto. Lo superé "cambiando las reglas", es decir, aplicando un esquema más estricto. Y gracias por la nota sobre el nombre de la etiqueta, eso también ha cambiado :) – Dana

7

Hay un gran artículo en MSDN que habla de desigining esquemas extensibles, que se puede encontrar here, le sugiero que vaya a pesar de todo, sino específicamente a su punto explica por qué' Está obteniendo este error en el punto 2. en "Uso de un esquema XML para diseñar un formato XML que se pueda descargar" (puede buscar "no determinista" y obtener directamente allí.

Básicamente, una vez que tiene un xs: cualquier elemento el validador no puede asumir nada sobre los otros elementos hermanos, por lo tanto, es posible que tenga una definición para la etiqueta importante que no requiera esos atributos obligatorios tes y esos elementos no pueden ser validados

+0

Y el artículo de Orchards aquí: http://www.xml.com/lpt/a/1329 – annakata

+0

Sí, gracias; lee esto también y piensa que es muy bueno. –

1

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", "eso debe ser falso") puede ser una solución mejor que el esquema W3C, que es más "todo debe ser así".