2013-07-02 7 views
14

Betrachten Sie das folgende Schema:Was ist der Unterschied zwischen Ref und Typ in einem XML-Schema?

<?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> 

Die ref zu "Child" on line 6 ausfällt, während die type auf Linie 7 überprüft. Für das Attribut ist die ref erfolgreich, während die type fehlschlägt. Ich versuche zu verstehen, warum.

Mein Verständnis von ref war, dass es einfach auf ein anderes Element verwiesen und angegeben, dass Sie erwarten, eine Instanz des verwiesenen Typs (mit dem Namen in der Definition angegeben) an diesem Ort zu sehen. Offensichtlich liege ich falsch, also was bedeutet ref eigentlich?

Antwort

14

Mit ref = ".." fügen Sie ein bestehendes Element/Attribut ein, das an der anderen Stelle definiert wurde. Mit type = ".." weisen Sie einem neuen Element/Attribut eine Struktur zu (definiert in complextype/simpletype). Betrachten Sie folgenden:

<?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, ich bekomme, dass "Typ" nur auf eine Typdefinition verweisen kann - das macht Sinn. Aber um über 'ref' zu klären: Es kann nur auf eine vorher existierende Instanz eines Elements zeigen und einen Klon davon einfügen? –

+2

Ja, ich denke, es könnte auf diese Weise gesagt werden (wenn "Instanz" irgendein Element der obersten Ebene bedeutet, das irgendwo in xsd deklariert ist). Ein weiterer Unterschied: Wenn Sie 'type' verwenden, können Sie zwei Elemente mit unterschiedlichen Namen mit derselben Struktur haben. Wenn Sie 'ref' verwenden, haben Sie überall Elemente mit demselben Namen oder derselben Struktur. –

3

Innerhalb eines Content-Modell, das xs:element Element kann entweder:

  1. einer Element-Deklaration (Angabe des Namens und der Art des Elements) oder
  2. Ein Verweis auf eine Top-Level-Element-Deklaration (geben Sie den Namen des Elements als eine Möglichkeit, es zu identifizieren, und verzögern die tatsächliche Deklaration für den Typ).

(Der gleiche Name/ref Wechsel gilt Erklärungen Attribut und Attributreferenzen, und es gibt eine ähnliche Dichotomie zwischen Inline-Definitionen und Verweise auf genannten Typen.)

In Ihrem Beispiel gibt es keine Spitze -level-Deklaration für ein Element namens Child, so dass das Attribut ref fehlschlägt. Ich hoffe das hilft.

0

Der wesentliche Unterschied zwischen ref und type ist, dass mit type nicht weiter unten eine Ebene gehen kann, aber mit ref, können Sie ein Element verwenden, das zusätzliche Ebene haben kann und so weiter.

Verwandte Themen