2010-04-22 10 views
15

¿Cómo puedo diseñar mi xsd para ignorar la secuencia de elementos?Ignorar el orden de los elementos usando xs: extensión

<root> <a/> <b/> </root> 

<root> <b/> <a/> </root> 

Tengo que utilizar extension por razones de generación de código, por lo que trataron los siguientes utilizando all:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/test" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:t="http://www.example.com/test" > 

    <xs:complexType name="BaseType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:complexType name="ExtendedType"> 
     <xs:complexContent> 
      <xs:extension base="t:BaseType"> 
       <xs:all> <!-- ERROR --> 
        <xs:element name="b" type="xs:string" /> 
       </xs:all> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:element name="root" type="t:ExtendedType"></xs:element> 
</xs:schema> 

Este XSD no es válida sin embargo, th e siguiente error se informa en <!-- ERROR -->:

cos-all-limited.1.2: Un grupo de todo el modelo debe aparecer en una partícula con {min} se produce = {ocurre max} = 1, y que las partículas debe ser parte de un par que constituye el {tipo de contenido} de una definición de tipo complejo.

Documentación de cos-all-limited.1.2 dice:

1,2 la {término} característica de una partícula con {ocurre max} = 1, que es parte de un par que constituye el {tipo de contenido} de un tipo complejo definición.

yo no entiendo muy bien esto (ni tampoco xsd Inglés nativo :)).


¿Estoy haciendo lo incorrecto, estoy haciendo lo correcto o no hay forma de lograrlo?

Respuesta

6

MAYOR EDIT Originalmente me olvidé de la necesidad de utilizar xsd:extension. Tenga en cuenta que xsd:extension funciona como si hubiera xsd:sequence con contenido del tipo base seguido de contenido del tipo extendido. Como esquema XML Primer pone:

Cuando un tipo de complejo se deriva por extensión, su modelo de contenido efectivo es el modelo de contenido del tipo base más el modelo de contenido especificado en el tipo de derivación. Además, los dos modelos de contenido se tratan como dos hijos de un grupo secuencial.

Por lo tanto, parece que la única manera de hacer que esto funcione es tener un tipo base vacío y almacenar toda la alternativa en el tipo extendido, o viceversa (todo en la base y una extensión vacía).De esta manera:

<xsd:complexType name="ExtendedType"> 
    <xsd:complexContent> 
     <xsd:extension base="BaseType"> 
     <xsd:choice> 
      <xsd:sequence> 
       <xsd:element name="a" type="xsd:string"/> 
       <xsd:element name="b" type="xsd:string"/> 
      </xsd:sequence> 
      <xsd:sequence> 
       <xsd:element name="b" type="xsd:string"/> 
       <xsd:element name="a" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:choice> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

<xsd:complexType name="BaseType"/> 

<xsd:element name="root" type="ExtendedType"/> 
+0

@Peter derecho, echaba de menos esa parte. Aquí hay una actualización. – Bolo

+0

Gracias por su actualización. Desafortunadamente necesito definir algunos elementos en el tipo base, y algunos en el extendido, así que a menos que haya otra forma, los elementos del tipo extendido siempre tendrán que ser colocados después de los elementos del tipo base ... –

+0

@Peter En ese caso, dado que "dos modelos de contenido se tratan como dos hijos de un grupo secuencial", no hay forma (hasta donde puedo ver) de ignorar la secuencia. – Bolo

-3

<xs:complexType name="BaseType"> 
    <xs:sequence> 
     <xs:element name="a" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="ExtendedType"> 
    <xs:complexContent> 
     <xs:extension base="t:BaseType"> 
      <xs:sequence> 
       <xs:element name="b" type="xs:string" /> 
      </xs:sequence> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="root" type="t:ExtendedType"></xs:element> 

+0

@Ruslan: ¿Has probado esto? Impondrá la secuencia de 'a' antes de' b', por lo que en realidad no me ayuda ... –

6

Aquí está la explicación de la restricción: http://marc.info/?l=xerces-j-user&m=118712527901786&w=4

La única extensión que puede hacer con el tipo de complejo con un "todo" modelo es agregar algunos atributos. No puedes extender con elementos nuevos.

En mi caso he hecho algo así:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.example.com/test" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:t="http://www.example.com/test" > 

    <xs:complexType name="BaseType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:complexType name="ExtendedType"> 
     <xs:all> 
      <xs:element name="a" type="xs:string" /> <!-- copy/paste from BaseType --> 
      <xs:element name="b" type="xs:string" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:element name="root" type="t:ExtendedType"></xs:element> 
</xs:schema> 
Cuestiones relacionadas