Let's start with a simple schema:
<xs:complexType name="AnimalType" abstract="true">
<xs:sequence>
<xs:element name="legs" xml:base="xs:nonNegativeInteger"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="DogType">
<xs:complexContent>
<xs:extension base="AnimalType">
<xs:sequence>
<xs:element name="furColor" xml:base="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="BirdType">
<xs:complexContent>
<xs:extension base="AnimalType">
<xs:sequence>
<xs:element name="canFly" xml:base="xs:boolean"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
Is it possible to define a root xs:element
named pet
that can be of any animal type? I.e. to make both of those documents valid:
<!-- a dog -->
<pet>
<legs>4</legs>
<furColor>black</furColor>
</pet>
<!-- a bird -->
<pet>
<legs>2</legs>
<canFly>true</canFly>
</pet>
Adding <xs:element name="pet" type="AnimalType"/>
does not work, because AnimalType
is abstract (and even if it wasn't I still wouldn't be able to add child elements from a derived type).
I need the pet
to be an instance of the AnimalType
, so setting the pet
's type to xs:anyType
is not an option.