2011-11-19 17 views
15

Stiamo scrivendo un nuovo schema xsd su cui baseremo e fare riferimento a un altro schema (che è uno standard di fatto per i dati GPS denominato GPX). Il nostro schema verrà utilizzato per convalidare i documenti generati dai nostri clienti e in fase di test. Ho bisogno di capire meglio come fare riferimento allo schema di base dal nostro nuovo schema, specialmente dato che non ci si può aspettare che i nostri sistemi abbiano una connessione Internet.Nozioni di base per fare riferimento a uno schema xsd da un altro schema

La mia comprensione è che i riferimenti ai documenti xsd su qualche altro server sono in genere lì in modo che uno sviluppatore possa recuperare il documento durante lo sviluppo ma durante la convalida del run-time del sistema si dovrebbe avere una copia locale di uno schema poiché non sarebbe prudente appendere la produzione semplicemente perché il server remoto era irraggiungibile. È corretto?

Allora, se questo è il caso, fa xsd mi aspettano di entrambi riferimento allo schema XSD base remota, ma anche il nome e la posizione di alcuni locale copia dello schema? O tale riferimento non è necessario nel mio nuovo file di schema? Spero che abbia un senso. Grazie.

risposta

27

Per fare riferimento a un altro schema, è una convenzione avere lo schema locale allo schema "principale" da cui si sta facendo riferimento. Ad esempio, per importare uno schema che definisca alcuni tipi riutilizzabili:

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

Questo è fondamentalmente dicendo che esiste uno schema chiamato CommonTypes.xsd che si ritroverà nella stessa directory come il mio schema principale. L'attributo schemaLocation viene utilizzato come percorso relativo al file di schema effettivo dal mio schema di riferimento (NOTA: è anche completamente facoltativo - vedi la mia nota in fondo a questa risposta).

Per utilizzare i tipi all'interno CommonTypes.xsd, in primo luogo ho aggiungere i tipi namespace comune nella mia dichiarazione sullo schema principale:

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

Questo sta dicendo che voglio fare i tipi dal mio schema comune disponibile nella mia schema principale usando il prefisso dello spazio dei nomi "comune".

Quindi, ad esempio, fare riferimento a un "Indirizzo" tipo comune:

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

Questo dice che il mio tipo di indirizzo di consegna è in realtà dello stesso tipo di AddressType definita nello schema comuni tipi.

Nota: schemaLocation può essere utilizzato anche con percorsi URI, assoluti o UNC, o non del tutto perché è un attributo interamente opzionale. Se non si utilizza schemaLocation, il parser eseguirà con molta probabilità la scansione delle directory locali alla ricerca di uno schema con lo spazio dei nomi corretto definito, ma ciò dipende dall'implementazione.

+1

In realtà, 'schemaLocation' non è altro che un suggerimento facoltativo per la posizione dello schema con quello spazio dei nomi. Il processore è libero di ignorarlo come meglio crede. – skaffman

+0

Quindi è basato sulla convenzione piuttosto che sulla definizione rigorosa? L'ho visto fare in questo modo molte altre volte e l'ho fatto io. –

+0

Alcune implementazioni potrebbero essere più rigide di altre, ma le specifiche dello schema XML indicano che è molto opzionale. – skaffman

Problemi correlati