Search code examples
xmlxsdxsd-validationcomplextype

XSD complex type extension with another complex type


I would like to define an XSD complex type using another complex type.

<xs:complexType name="A">
   <!-- sequence with some elements -->
</xs:complexType>

<xs:complexType name="B">
   <!-- sequence with some elements -->
</xs:complexType>

<xs:complexType name="C">       
    <xs:complexContent>             
        <xs:extension base="A">
            <!-- ??? reference to complex type B ??? -->
        </xs:extension>
    </xs:complexContent>            
</xs:complexType>

Is there a way to do it without declaring a new element of type B?

EDIT:

Now that I think of it, type extension with another type is probably not permitted in order to forbid self-extension.

As RCB suggested, one can use a group as a workaround.

<xs:complexType name="A">
   <!-- sequence with some elements -->
</xs:complexType>

<xs:group name="B">
   <!-- sequence with some elements -->
</xs:group>

<xs:complexType name="B">
   <xs:group ref="B"/>
</xs:complexType>

<xs:complexType name="C">       
    <xs:complexContent>             
        <xs:extension base="A">
            <xs:group ref="B"/>
        </xs:extension>
    </xs:complexContent>            
</xs:complexType>

Solution

  • If you are able to change B from a complexType to a group, then you could do:

    <xs:group name="B">
        <xs:sequence>
            <!-- Some elements -->
        </xs:sequence>
    </xs:group>
    
    <xs:complexType name="C">
        <xs:complexContent>
            <xs:extension base="A">
                <xs:group ref="B"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>