2010-05-13 81 views
3

我想從xsd模式中的基本類型派生複雜類型。使用xml類型屬性派生複雜類型

它運作良好,當我這樣做(由this啓發):

XML文件:

 <person 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:type="Employee"> 
     <name>John</name> 
     <height>59</height> 
     <jobDescription>manager</jobDescription> 
    </person> 

XSD文件:

 <xs:element name="person" type="Person"/> 

     <xs:complexType name="Person" abstract="true"> 
     <xs:sequence> 
      <xs:element name= "name" type="xs:string"/> 
      <xs:element name= "height" type="xs:double" /> 
     </xs:sequence> 
     </xs:complexType> 

     <xs:complexType name="Employee"> 
     <xs:complexContent> 
      <xs:extension base="Person"> 
       <xs:sequence> 
        <xs:element name="jobDescription" type="xs:string" /> 
       </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 

但是,如果我想擁有的人元素內部,例如,另一個複雜類型的序列,它不再有效:

XML:

<staffRecord> 
     <company>mycompany</company> 
     <dpt>sales</dpt> 
     <person 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:type="Employee"> 
     <name>John</name> 
     <height>59</height> 
     <jobDescription>manager</jobDescription> 
     </person> 
    </staffRecord> 

XSD文件:

<xs:element name="staffRecord"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="company" type="xs:string"/> 
     <xs:element name="dpt" type="xs:string"/> 

     <xs:element name="person" type="Person"/> 

      <xs:complexType name="Person" abstract="true"> 
      <xs:sequence> 
       <xs:element name= "name" type="xs:string"/> 
       <xs:element name= "height" type="xs:double" /> 
      </xs:sequence> 
      </xs:complexType> 

      <xs:complexType name="Employee"> 
      <xs:complexContent> 
       <xs:extension base="Person"> 
        <xs:sequence> 
         <xs:element name="jobDescription" type="xs:string" /> 
        </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
      </xs:complexType> 


    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

當驗證XML與架構與xmllint(linux下),我得到那麼這個錯誤消息:

config.xsd :12:元素complexType: 模式解析器錯誤:元素 '{http://www.w3.org/2001/XMLSchema}序列': 內容無效。期待是 (註釋①,(元| 選擇)*)。 WXS模式 config.xsd編譯失敗

任何想法是什麼錯?

大衛

回答

0

的xsd:序列元素只能包含子元素的以下列表中的一個: 最多一個註釋,以及多達元素,組,選擇,順序,任何的,如你的願望。

你的序列元素有兩個complexType元素,它是無效的。編輯: 查看http://www.w3.org/TR/xmlschema-1/#element-sequence瞭解詳情。

編輯2: 甲sequence是元件的不類型,序列。沒有多態性。說明元素X包含序列A,B和任何看起來有點像C的東西是不夠好的,你必須準確地陳述你想要的類C元素。

選項包括,

a)確定對應於Person和僱員種類在根級別element元件(即下的xs:模式),並引用它們下staffRecordelement[@ref]

B)包裹所述兩個complexType元件在兩個單獨的element元件。

+0

是啊,我可以閱讀錯誤信息......雖然沒有幫助解決問題 – dm76 2010-05-13 13:21:14

+0

您問過什麼是錯的,我的答案是完整的。它確實有助於解決問題,您只需從允許的元素列表中選擇一個元素,然後使用它。 我現在已經更新了我的答案,以提供兩種可能的解決方案。 – 2010-05-13 13:55:58

+0

所以,如果有人發佈類似「我得到一個'編譯錯誤',有什麼問題?」,你會回答「它發生是因爲你的編譯器遇到錯誤」......非常有用 – dm76 2010-05-17 10:42:58