2009-07-29 3 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 наследуется от нескольких типов вместо учетной записи?

ответ

0

Множественное наследование чего? Если вы имеете в виду типы, то нет.

21

Кое-что, похожее на множественное наследование в некотором роде, может управляться с использованием именованной группы моделей и названных групп атрибутов; похоже ли это на множественное наследование так, как вы хотите, это то, что вы можете сказать.

Предположим, у вас есть сложные типы Учетная запись (как показано выше) и Клиент, и вы хотите, чтобы сложный тип 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 валидатор не будет рассматривать типы клиентов, счета и CreditCardAccount как связанные в данном случае, что может или не может дело.

Конечно, более простой подход будет использовать элементы, как пакеты информации, а также определить элементы счета, клиент, и CreditCardAccount с CreditCardAccount, содержащей (сюрпризом) элементом счета и элементом Customer.

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»

Смежные вопросы