Подтвердить что ты не робот

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

4b9b3361

Ответ 2

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

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

Ответ 3

Другая стратегия - иметь цепочечные расширения.

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

Ответ 4

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