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가 각각에서 상속 받기를 원한다고 가정 해보십시오. 다른 사람들이 지적했듯이, 복잡한 유형 정의에서는 두 가지 기본 유형을 지정할 수 없습니다. 그러나 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에서 모두라는 이름의 그룹을 참조 할 수 있습니다 :이 경우 관련 같은 유형의 고객, 계정 및 CreditCardAccount을 생각하지 않을 것이다

XSD 유효성 검사기

<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> 
하는 수도 있고하지 않을 수 문제. 물론

, 단순한 접근 방식은 정보의 패키지와 같은 요소를 사용하는 것, 그리고 포함 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"

을하지 않습니다