2011-11-19 20 views
15

Estamos escribiendo un nuevo esquema xsd que se basará y referenciará a otro esquema (que es un estándar de facto de la industria para datos de GPS llamado GPX). Nuestro esquema se usará para validar documentos generados por nuestros clientes y en pruebas. Necesito comprender mejor cómo hacer referencia al esquema base de nuestro nuevo esquema, especialmente dado que no se puede esperar que nuestros sistemas tengan una conexión a Internet.Conceptos básicos para hacer referencia a un esquema xsd desde otro esquema

Mi comprensión es que las referencias a documentos xsd en otro servidor suelen estar allí para que un desarrollador pueda recuperar el documento durante el desarrollo, pero durante la validación del tiempo de ejecución del sistema sería conveniente tener una copia local de un esquema dado que no sería prudente suspender la producción simplemente porque el servidor remoto era inalcanzable. ¿Es esto correcto?

Así que si ese es el caso, ¿xsd esperas que tanto hacer referencia al esquema XSD base remota, sino también el nombre y la ubicación de algunos locales copia del esquema? ¿O tal referencia no es necesaria en mi nuevo archivo de esquema? Espero que tenga sentido. Gracias.

Respuesta

27

Para hacer referencia a otro esquema, es una convención tener ese esquema local para el esquema "principal" al que hace referencia. Por ejemplo, para importar un esquema que define algunos tipos reutilizables:

<xs:import namespace="http://CommonTypesNamespace/CommonTypes" 
      schemaLocation="CommonTypes.xsd"/> 

Esto es básicamente diciendo que existe un esquema denominado CommonTypes.xsd que se encuentra en el mismo directorio que mi esquema principal. El atributo schemaLocation se usa como una ruta relativa al archivo de esquema real desde mi esquema de referencia (NOTA: también es completamente opcional; consulte mi nota en la parte inferior de esta respuesta).

Para utilizar los tipos dentro CommonTypes.xsd, primero agregue los tipos de espacio de nombres comunes en mi declaración de esquema principal:

<xs:schema targetNamespace="http://MyNamespace/MyTypes" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified" 
      xmlns:common="http://CommonTypesNamespace/CommonTypes"> 

Esto está diciendo que quiero hacer los tipos de mi esquema común disponible en mi esquema principal usando el prefijo del espacio de nombres "común".

Entonces, por ejemplo, para hacer referencia a una "dirección" tipo común:

<xs:element name="DeliveryAddress" type="common:AddressType" /> 

Esto dice que mi tipo de dirección de entrega es en realidad el mismo tipo que AddressType definido en el esquema tipos comunes.

Nota: schemaLocation también se puede usar con rutas URI, absolutas o UNC, o no se puede utilizar en absoluto porque es un atributo totalmente opcional. Si no utiliza schemalocation, es probable que su analizador escanee los directorios locales buscando un esquema con el espacio de nombre correcto definido, pero esto depende de la implementación.

+1

En realidad, 'schemaLocation' no es más que una sugerencia opcional sobre la ubicación del esquema con ese espacio de nombres. El procesador puede ignorarlo como lo considere oportuno. – skaffman

+0

¿Está basado en la convención más que en la definición estricta? Lo he visto hecho de esta manera muchas veces antes, y he hecho esto yo mismo. –

+0

Algunas implementaciones pueden ser más estrictas que otras, pero la especificación del esquema XML dice que es muy opcional. – skaffman

Cuestiones relacionadas