2013-07-02 12 views
14

Si consideri il seguente schema:Qual è la differenza tra ref e type in uno schema XML?

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="Root"> 
     <xs:sequence> 
      <xs:element ref="Child" /> 
      <xs:element name="Child2" type="Child" /> 
     </xs:sequence> 
     <xs:attribute ref="Att" /> 
     <xs:attribute name="Att2" type="Att" /> 
    </xs:complexType> 

    <xs:complexType name="Child"> 
     <xs:attribute ref="Att" /> 
    </xs:complexType> 

    <xs:attribute name="Att" type="xs:integer" /> 

</xs:schema> 

Il ref a "Child" sulla linea 6 fallisce, mentre i type on line 7 Convalida. Per l'attributo, il ref ha esito positivo mentre lo type ha esito negativo. Sto cercando di capire perché.

La mia comprensione di ref era che si riferiva semplicemente a un altro elemento e specificava che ci si aspetta di vedere un'istanza del tipo indicato (con il nome dato nella definizione) in quella posizione. Ovviamente mi sbaglio, quindi cosa significa in realtà ref?

risposta

14

Utilizzando ref = ".." si sta "incollando" l'elemento esistente/l'attributo definito sull'altro posto. Usando type = ".." stai assegnando una struttura (definita in complextype/simpletype) al nuovo elemento/attributo. Guardate seguente:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tst="test" targetNamespace="test"> 

    <xs:complexType name="Root"> 
     <xs:sequence> 
      <xs:element ref="tst:Child" /> 
      <xs:element name="Child2" type="tst:ChildType" /> 
     </xs:sequence> 
     <xs:attribute ref="tst:AttRef" /> 
     <xs:attribute name="Att2" type="tst:AttType" /> 
    </xs:complexType> 

    <xs:complexType name="ChildType"> 
     <xs:attribute ref="tst:AttRef" /> 
    </xs:complexType> 

    <xs:element name="Child"> 
    </xs:element> 

    <xs:simpleType name="AttType"> 
     <xs:restriction base="xs:string"> 
      <xs:maxLength value="10" /> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:attribute name="AttRef" type="xs:integer" /> 

</xs:schema> 
+0

OK, ho capito che 'type' può riferirsi solo a una definizione di tipo - ha senso. Ma per chiarire su 'ref': può solo puntare a un'istanza preesistente di un elemento e inserirne un clone? –

+2

Sì, penso che si possa dire in questo modo (se "istanza" significa qualche elemento di livello superiore dichiarato da qualche parte in xsd). Un'altra differenza: quando si utilizza 'type', è possibile avere due elementi con un nome diverso con la stessa struttura. Quando usi 'ref', hai elementi con lo stesso nome o struttura ovunque. –

3

All'interno di un modello di contenuto, l'elemento xs:element può essere sia:

  1. Una dichiarazione di elemento (che dà il nome e il tipo di elemento) o
  2. Un riferimento a una dichiarazione di elemento di livello superiore (che fornisce il nome dell'elemento come metodo di identificazione e posticipo alla dichiarazione effettiva per il tipo).

(Lo stesso nome/alternanza ref vale per attribuire le dichiarazioni ed attribuire i riferimenti, e v'è una dicotomia simile tra le definizioni di tipo inline e riferimenti a tipi di nome.)

Nel tuo esempio, non v'è alcun top -level dichiarazione per un elemento denominato Child, pertanto l'attributo ref non riesce. Spero che aiuti.

0

La differenza significativa tra ref e type è che con type non è possibile andare più in basso di un livello, ma con ref, è possibile utilizzare un elemento che può avere un livello aggiuntivo e così via.

Problemi correlati