XML schemas with multiple inheritance XML schemas with multiple inheritance xml xml

XML schemas with multiple inheritance


Something that resembles multiple inheritance in some ways can be managed using named model group and named attribute groups; whether it resembles multiple inheritance in the way you want is something only you can tell.

Suppose you have complex types Account (as shown above) and Customer, and you'd like complex type CreditCardAccount to inherit from each of them. As others have pointed out, you can't specify two base types in a complex type definition. But you can package the content model of the Account and Customer types into named model groups, and refer to the appropriate named group from the type definition.

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

Then you can refer to both named groups from 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>

An XSD validator will not regard the types Customer, Account, and CreditCardAccount as related in this case, which may or may not matter.

Of course, a simpler approach would be to use elements as packages of information, and define elements Account, Customer, and CreditCardAccount, with CreditCardAccount containing (surprise) an Account element and a Customer element.


Another strategy is to have chained extensions.

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

Note, however, that you would not be able to have an complex type that "HasAssociations" but does NOT "HaveIdentifier"