- From: Shirish Kulkarni <shirish_kul@yahoo.com>
- Date: Tue, 4 Mar 2003 03:22:17 -0800 (PST)
- To: Jeni Tennison <jeni@jenitennison.com>
- Cc: xmlschema-dev@w3.org
Thanks Jeni for a quick and informative response. Another dimension to the problem is when I would not like to have the Type1 or Type2 exposed to the instance document ( but a common type "TopType" is fine ) and still able to switch the validation to the required type internally. a.xml => <Node xsi:type="TopType"> <Sub1> <Sub2> <Sub3> </Node> b.xml => <Node xsi:type="TopType"> <Sub4> <Sub5> </Node> and within Schema I will have c.xsd => <xs:complexType name="BaseType" abstract="true" /> <xs:complexType name="Type1"> <xs:complexContent> <xs:extension base="BaseType"> <xs:sequence> <xs:element name="Sub1" type="xsd:string"/> <xs:element name="Sub2" type="xsd:string"/> <xs:element name="Sub3" type="xsd:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="Type2"> <xs:complexContent> <xs:extension base="BaseType"> <xs:sequence> <xs:element name="Sub4" type="xsd:string"/> <xs:element name="Sub5" type="xsd:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TopType"> <xs:complexContent> <xs:extension base="Type1"> </xs:extension> <xs:extension base="Type2"> </xs:extension> </xs:complexContent> </xs:complexType> Is it feasible to have a type getting extension from two types ? Would this switch the validation to types to Type1 & Type2 on the basis of the contents of the <Node> element ? With best regards, Shirish --- Jeni Tennison <jeni@jenitennison.com> wrote: > Hi Shirish, > > > I would like to have an element to have a type, > which is a choices > > between number of types. > > The only way the same element can take on different > complex types in > XML Schema is if the types are related. You then > have to switch > between the types using the xsi:type attribute on > the element in the > instance document. For example: > > a.xml => > <Node xsi:type="Type1"> > <Sub1> > <Sub2> > <Sub3> > </Node> > > b.xml => > <Node xsi:type="Type2"> > <Sub4> > <Sub5> > </Node> > > Your types are related already, since they are both > restrictions of > xs:anyType, so you could just use the declaration: > > <xs:element name="Node" type="xs:anyType" /> > > but this would mean that the element could contain > anything (unless > the xsi:type attributes were present). So it's > probably best to create > an anonymous abstract type from which the two types > can be derived by > extension: > > <xs:complexType name="BaseType" abstract="true" /> > > <xs:complexType name="Type1"> > <xs:complexContent> > <xs:extension base="BaseType"> > <xs:sequence> > <xs:element name="Sub1" type="xsd:string"/> > <xs:element name="Sub2" type="xsd:string"/> > <xs:element name="Sub3" type="xsd:string"/> > </xs:sequence> > </xs:extension> > </xs:complexContent> > </xs:complexType> > > <xs:complexType name="Type2"> > <xs:complexContent> > <xs:extension base="BaseType"> > <xs:sequence> > <xs:element name="Sub4" type="xsd:string"/> > <xs:element name="Sub5" type="xsd:string"/> > </xs:sequence> > </xs:extension> > </xs:complexContent> > </xs:complexType> > > You can then declare the element to be of that > abstract base type: > > <xs:element name="Node" type="BaseType" /> > > Cheers, > > Jeni > > --- > Jeni Tennison > http://www.jenitennison.com/ > __________________________________________________ Do you Yahoo!? Yahoo! Tax Center - forms, calculators, tips, more http://taxes.yahoo.com/
Received on Tuesday, 4 March 2003 06:22:49 UTC