2011-06-20 10 views
17

Ho due XSD che definiscono documenti diversi. Dire A.xsd definisce un elemento ElementA come la radice, con alcune regole complesse. Ora B.xsd definisce un elemento ElementB che dovrebbe utilizzare ElementA da qualche parte nel mezzo.XSD con elementi di altri domini

Ad esempio voglio il file XML per ElementB simile a questa:

<?xml version="1.0" encoding="utf-8"?> 
<ElementB xmlns="http://example.com/namespace/for/ElementB"> 
    <foo>Bla</foo> 
    <bar>Blub</bar> 
    <ElementA xmlns="http://example.com/namespace/for/ElementA"> 
    <!-- ... --> 
    </ElementA> 
</ElementB> 

Poi B.xsd potrebbe assomigliare a questo:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="http://example.com/namespace/for/ElementB" targetNamespace="http://example.com/namespace/for/ElementB" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="ElementB"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="foo" type="xs:string" /> 
     <xs:element name="bar" type="xs:string" /> 

     <!-- And now I want to include ElementA somehow --> 
     <xs:element name="ElementA" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Il fatto è che io non voglia di clone la specifica di ElementA in B.xsd, in quanto vi sono anche documenti, che hanno solo ElementA come radice (ovvero ElementB è una sorta di documento contenitore).

Quindi, come posso consentire ElementA all'interno di ElementB mentre sto costruendo completamente sopra l'XSD già esistente?

risposta

29

Esistono due modi diversi per comporre i documenti XML Schema: <xs:import> e <xs:include>. xs: include è inteso per essere usato quando lo spazio dei nomi del documento che contiene è uguale a quello a cui si fa riferimento, quindi non è proprio quello che stai cercando. xs: l'importazione è migliore per la situazione in cui è necessario fare riferimento a tutti (o un sottoinsieme) di elementi nello schema di riferimento e si trovano in uno spazio dei nomi di destinazione diverso. C'è una domanda qui sulle differenze: What's the difference between xsd:include and xsd:import?.

In ogni caso, torniamo a questa domanda specifica. Che probabilmente si desidera è qualcosa di simile:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema 
    xmlns="http://example.com/namespace/for/ElementB" 
    targetNamespace="http://example.com/namespace/for/ElementB" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    xmlns:ea="http://example.com/namespace/for/ElementA"> 
<xs:import namespace="http://example.com/namespace/for/ElementA" schemaLocation="A.xsd" /> 
<xs:element name="ElementB"> 
    <xs:complexType> 
    <xs:sequence> 
    <xs:element name="foo" type="xs:string" /> 
    <xs:element name="bar" type="xs:string" /> 
    <!-- This introduces a element named ElementA that uses the ComplexType ea:ElementA defined in A.xsd --> 
    <xs:element name="ElementA" type="ea:ElementA" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 
</xs:schema> 

anche se avrete bisogno A.xsd per creare un tipo complesso per Elementa che è possibile utilizzare in B.xsd come mostrato.

Questo arcticle ha alcune buone informazioni/esempi e comprende una discussione di alcune delle diverse strategie di componibilità: http://www.xfront.com/ZeroOneOrManyNamespaces.html

+0

Grazie, sembra abbastanza buono, ci proverò. Una domanda però, da dove viene il prefisso 'ea:' namespace? O è che il 'nome' la definizione del tipo si trova in' A.xsd'? – poke

+0

Scorri semplicemente verso destra nella finestra del codice: viene indicato come ultimo attributo nell'elemento xs: schema: 'xmlns: ea =" http://example.com/namespace/for/ElementA "'. Puoi dargli il prefisso che vuoi, proprio come puoi per lo spazio dei nomi di destinazione predefinito (sebbene tutti scelgano sempre 'xs' o' xsd' per convenzione). – daveaglick

+0

Oh, non mi sono preoccupato di scorrere così lontano e mi sono perso, mi dispiace xD Grazie anche per il tuo aiuto, proverò questo il prima possibile e pubblicherò i miei risultati :) – poke

1

È possibile utilizzare il tag <xsd:import> per importare uno schema con un altro spazio dei nomi.

+2

Mi potete dare un esempio di come utilizzare che con il mio esempio di cui sopra? Il tuo link in realtà non lo spiega ... – poke

Problemi correlati