Ответ 1
Нет, это невозможно. XML Schema 1.0 Spec определяет, что существует только один элемент расширения.
Возможно ли иметь множественное наследование в 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 наследуется от нескольких типов вместо учетной записи?
Нет, это невозможно. XML Schema 1.0 Spec определяет, что существует только один элемент расширения.
Некоторое, что по-разному напоминает множественное наследование, можно управлять с помощью именованной группы моделей и названных групп атрибутов; похоже ли это на множественное наследование так, как вы хотите, это то, что вы можете сказать.
Предположим, у вас есть сложные типы Учетная запись (как показано выше) и Клиент, и вы хотите, чтобы сложный тип CreditCardAccount наследовался от каждого из них. Как указывали другие, вы не можете указать два базовых типа в определении сложного типа. Но вы можете упаковать модель контента типов учетных записей и клиентов в именованные группы моделей и обратиться к соответствующей именованной группе из определения типа.
<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 не будет рассматривать типы Customer, Account и CreditCardAccount как связанные в этом случае, что может или не имеет значения.
Конечно, более простой подход состоял бы в том, чтобы использовать элементы как пакеты информации и определять элементы Account, Customer и CreditCardAccount, при этом CreditCardAccount содержит (удивляет) элемент Account и элемент Customer.
Другая стратегия - иметь цепочечные расширения.
<?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"
Множественное наследование чего? Если вы имеете в виду типы, то нет.