2013-07-02 107 views
14

考慮下面的模式:在第6行XML模式中的ref和type有什麼區別?

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

ref爲 「孩子」 失敗,而type第7點進行驗證。對於該屬性,ref成功,而type失敗。我試圖理解爲什麼。

我對ref的理解是,它只是引用另一個元素,並指定您期望在該位置看到引用類型(具有定義中給出的名稱)的實例。顯然我錯了,那麼ref實際上是什麼意思?

回答

14

使用ref =「..」您正在「粘貼」在其他地方定義的現有元素/屬性。使用type =「..」,你正在將一些結構(在complextype/simpletype中定義)分配給新元素/屬性。看以下內容:

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

好的,我得到'type'只能引用類型定義 - 這是有道理的。但是爲了澄清'ref':它只能指向一個預先存在的元素實例並插入一個它的克隆? –

+2

是的,我認爲可以這樣說(如果「實例」是指在xsd中聲明某個頂級元素)。 另一個區別是:當你使用'type'的時候,你可以有兩個具有不同名稱的元素具有相同的結構。當你使用'ref'的時候,你在任何地方都有相同名稱或結構的元素。 –

3

在內容模型中,xs:element元件可以是:

  1. 一種元素聲明(給出的元素的名稱和類型) 或
  2. 所述的參考一個頂級元素聲明(給出元素的名稱作爲標識它的一種方式,並且根據該類型實際聲明)。

(同名/ REF交替適用於屬性聲明和屬性引用,並有內嵌式定義和引用之間類似的二分法來命名類型。)

在你的榜樣,沒有頂名爲Child的元素的級別聲明,因此ref屬性失敗。我希望這有幫助。

0

ref和type之間的重要區別在於,對於類型,您不能繼續向下,但使用ref時,可以使用可以具有其他級別的元素等等。

相關問題