2010-03-18 21 views
13

¿Es posible de alguna manera, para definir un esquema XSD que podría validar tales xml:¿Cómo se definen varios elementos con el mismo nombre, pero diferentes tipos en xsd: Elemento de elección?

<item_list> 
    <item ItemType="SimpleMessage" Caption="Simplest message"/> 
    <item ItemType="ComplexMessage" SomeAttr="value"> 
    <item_data>some text</item_data> 
    </item> 
</item_list> 

problema es que havn't encontrar ninguna posibilidad de definir algo bajo como:

<xsd:element name="Items"> 
     <xsd:complexType> 
     <xsd:choice> 
      <xsd:element name="item" type="SimpleMessType"/> 
      <xsd:element name="item" type="ComplexMessType"/> 
     </xsd:choice> 
     </xsd:complexType> 
    </xsd:element> 

Pero Necesito comprobar que SimpleMessage no tiene elementos hijo o attrs adicionales :(

Respuesta

0

No puede hacer esto usando la estructura de esquema que ha propuesto, porque la estructura viola las reglas de ambigüedad del esquema XML.

Una posible opción para usted es definir un super-tipo, digamos BaseElement, que está vacío, y luego subtipos, y usar xsi:type para reemplazar en lugar de solo un atributo type normal. Puede encontrar más información sobre cómo funciona eso here.

5

XSD expresamente prohibits such a case. Debe cambiar los nombres de los elementos para que sean únicos (o use xsi: escriba como dice xcut, lo que equivale a lo mismo).

Como solución alternativa, se podría combinar las definiciones de tipo SimpleMessType y ComplexMessType en un solo tipo con mixta = "true" - y luego separar el contenido que recibe en su propio código después de esquema el procesamiento esta completo Consulte la discusión de stackoverflow sobre XSD schema for recursive XML.

6

Como las respuestas anteriores ya han mencionado, puede hacerlo con bastante facilidad en XSD 1.0 utilizando el atributo xsi:type en lugar de definir un nuevo atributo ItemType con la misma funcionalidad.

XSD 1.1 incluye una construcción diseñada para que sea más fácil admitir casos como este, para personas que por cualquier razón no desean usar xsi:type de esta manera: asignación de tipo condicional. Básicamente, permite que una declaración de elemento tenga una secuencia simple de pares XPath/typename; las expresiones XPath se evalúan en secuencia y cuando se evalúa como verdadero, el elemento se asocia con el tipo correspondiente. Hay restricciones en los XPath para prohibir mirar hacia adelante en los descendientes del elemento o mirar hacia arriba o hacia afuera en otras partes del documento XML (el primero ayuda a saber, tan pronto como un escaneo encuentre una etiqueta de inicio, que escriba a utilizar para validar un elemento, el segundo ayuda a mantener la validación sin contexto), por lo que esencialmente las pruebas solo pueden ser pruebas de valores de atributos. Su ejemplo se puede escribir así:

<xs:element name="item"> 
    <xs:alternative test="@ItemType='SimpleMessage'" type="SimpleMessType"/> 
    <xs:alternative test="@ItemType='SimpleMessage'" type="ComplexMessType"/> 
    <xs:alternative type="xs:error"/> 
</xs:element> 

La tercera alternativa asegura que uno de sus casos esperados han de encontrar, para el elemento de ser válida. Si se omitiera aquí, entonces si ninguna de las expresiones de prueba fuera verdadera, se le asignaría al elemento el tipo declarado de item, en este caso xs:anyType.

Cuestiones relacionadas