You can also use a constraint, not an extension, but this is not the best solution, because the constraint removes all the basic definitions. The best case is to use xsi: type at runtime (in instances of XML elements), as described in another answer.
More than one example of using xsi: type is here: http://www.xfront.com/ElementHierarchy.html
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="root" type="B"/> <xsd:complexType name="A" abstract="true"> <xsd:sequence> <xsd:element name="options" type="options"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="B"> <xsd:complexContent> <xsd:restriction base="A"> <xsd:sequence> <xsd:element name="options" type="ex_options"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:complexType name="options"> <xsd:sequence> <xsd:element name="baseOption"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="ex_options"> <xsd:complexContent> <xsd:restriction base="options"> <xsd:sequence> <xsd:element name="overridedOption"/> </xsd:sequence> </xsd:restriction> </xsd:complexContent> </xsd:complexType> </xsd:schema>
In pseudo CiXML, it would be something like this:
{ B root; abstract class A { options options; } class B override A { ex_options options; } class options { empty baseOption; } class ex_option override options { empty overridedOption } }
Here is an example XML:
<?xml version="1.0" encoding="UTF-8"?> <root xsi:noNamespaceSchemaLocation="polymorphism.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <options> <overridedOption/> </options> </root>
source share