2009-07-29 99 views
17

是否可以在XML模式中擁有多重繼承?具有多繼承性的XML模式

<xs:schema xmlns:xs="http://www.w3.org/2001/Schema" ....> 

<xs:complexType name="Account"> 
    <xs:sequence> 
    <xs:element name="balance" type="xs:decimal"/> 
    <xs:element name="accountNo" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="CreditCardAccount"> 
    <xs:complexContent> 
    <xs:extension base="Account"> 
    <xs:sequence> 
     <xs:element name="expiryDate" type="xs:date"/> 
     <xs:element name="issuer" type="xs:string"/> 
     <xs:element name="type" type="xs:string" use="required"/> 
    </xs:sequence> 
    </xs:extension> 
    <xs:complexContent> 
</xs:complexType> 

</xs:schema> 

我的問題是; CreditCardAccount是否可以繼承多個類型而不是Account Only?

回答

0

多繼承什麼?如果你的意思是類型,那麼沒有。

21

某些類似於多重繼承的某些方面可以使用命名模型組和命名屬性組進行管理;它是否像你想要的方式類似多重繼承是你可以告訴的事情。

假設您有複雜類型Account(如上所示)和Customer,並且您希望複雜類型CreditCardAccount從它們中的每一個繼承。正如其他人指出的那樣,您不能在複雜類型定義中指定兩種基本類型。但是您可以將Account和Customer類型的內容模型打包到指定的模型組中,並從類型定義中引用相應的命名組。

<xs:group name="Account"> 
    <xs:sequence> 
    <xs:element name="balance" type="xs:decimal"/> 
    <xs:element name="accountNo" type="xs:string"/> 
    </xs:sequence> 
</xs:group> 

<xs:group name="Customer"> 
    <xs:sequence> 
    <xs:element name="custid" type="xs:int"/> 
    <xs:element name="street" type="xs:string"/> 
    <xs:element name="city" type="xs:string"/> 
    <xs:element name="phone" type="xs:string"/> 
    </xs:sequence> 
</xs:group> 

<xs:complexType name="Account"> 
    <xs:sequence> 
    <xs:group ref="Account"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="Customer"> 
    <xs:sequence> 
    <xs:group ref="Customer"/> 
    </xs:sequence> 
</xs:complexType> 

那麼你可以參考這兩個命名組從CreditCardAccount:

<xs:complexType name="CreditCardAccount"> 
    <xs:sequence> 
    <xs:group ref="Account"/> 
    <xs:group ref="Customer"/> 
    <xs:element name="expiryDate" type="xs:date"/> 
    <xs:element name="issuer" type="xs:string"/> 
    <xs:element name="type" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 

的XSD驗證不會把各類客戶信息,賬戶,並CreditCardAccount在這種情況下,相關的,可能會或可能不會物。

當然,更簡單的方法將是使用元素作爲信息包,並定義元件的帳戶,客戶,和CreditCardAccount,用含有CreditCardAccount(驚訝)帳戶元件和客戶元件。

2

另一種策略是鏈接擴展。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema targetNamespace="http://mycompany.com/contacts" 
      xmlns="http://mycompany.com/contacts" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="HaveIdentifier"> 
     <xs:sequence> 
      <xs:element name="UUID" type="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="HasAssociations"> 
     <xs:complexContent> 
      <xs:extension base="HaveIdentifier"> 
       <xs:sequence> 
        <xs:element name="Associations" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="Address"> 
     <xs:complexContent> 
      <xs:extension base="HaveIdentifier"> 
       <xs:sequence> 
        <xs:element name="Street" type="xs:string" minOccurs="0" maxOccurs="1"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:complexType name="Contact"> 
     <xs:complexContent> 
      <xs:extension base="HasAssociations"> 
       <xs:sequence> 
        <xs:element name="Name" type="xs:string" minOccurs="0" maxOccurs="1"/> 
        <xs:element name="Addresses" type="Address" minOccurs="0" maxOccurs="unbounded"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

但是請注意,你將不能夠有一個複雜類型,「HasAssociations」但不「HaveIdentifier」