- From: Eddie Robertsson <erobertsson@allette.com.au>
- Date: Mon, 27 May 2002 10:10:37 +1000
- To: mlong@phalanxsys.com
- CC: xmlschema-dev@w3.org
Hi Matt,
No, you can't do that using the design you have in your schema. However,
if I understand your problem correct I think you can use the technique
of using xsi:type in the instance document to specify which type an
element should use from the instance document. Here is a modified
version of your schema where complexTypes are used instead of groups:
<xsd:element name=”whatIsIt” type=”baseType”/>
<!-- Empty type that is used as a common base for personType and
placeType -->
<xsd:complexType name="baseType"/>
<!-- Type defining the person -->
<xsd:complexType name=”personType”>
<xsd:complexContent>
<xsd:extension base="baseType">
<xsd:sequence>
<xsd:element name=”firstName” type=”xsd:string”/>
<xsd:element name=”lastName” type=”xsd:string”/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!-- Type defining the place -->
<xsd:complexType name=”placeType”>
<xsd:complexContent>
<xsd:extension base="baseType">
<xsd:sequence>
<xsd:element name=”country” type=”xsd:string”/>
<xsd:element name=”city” type=”xsd:string”/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
Note that the whatIsIt element have the type baseType. Also, I have
removed you qualifier element because instead of using an element to
qualify which type is used we're going to use xsi:type in the instance
to specify which of the derived types the whatIsIt element has. E.g.
<whatIsIt xsi:type="personType">
<firstName>aaa</firstName>
<lastName>bbb</lastName>
</whatIsIt>
This will only validate the whatIsIt element if it has subelements
matching the personType. The same applies for the placeType:
<whatIsIt xsi:type="placeType">
<country>aaa</country>
<city>bbb</city>
</whatIsIt>
Is this something that would fit your requirement?
Cheers,
/Eddie
> Is it possible to utilize ‘choice’ from an element value (not purely
> the existence of the element name)
>
> Example: a schema with a qualifier (1=person, 2=place)…so the question
> is how can one determine the group ref from the element value of
> ‘qualifier’ element (or is it simply not possible)?
>
> -Matt Long
>
> Phalanx Systems, LLC
>
> <xsd:element name=”whatIsIt” type=”z:infoType”/>
>
> <xsd:complexType name=”infoType”>
>
> <xsd:sequence>
>
> <xsd:element name=”qualifier” type=”z:myQualType”/>
>
> <!—how can ‘qualifier’ qualify the choice of group reference à
>
> <xsd:choice>
>
> <xsd:group ref=”z:personGroup”/>
>
> <xsd:group ref=”z:placeGroup”/>
>
> </xsd:choice>
>
> </xsd:sequence>
>
> </xsd:complexType>
>
> <xsd:group name=”personGroup”>
>
> <xsd:sequence>
>
> <xsd:element name=”firstName” type=”xsd:string”/>
>
> <xsd:element name=”lastName” type=”xsd:string”/>
>
> </xsd:sequence>
>
> </xsd:group>
>
> <xsd:group name=”placeGroup”>
>
> <xsd:sequence>
>
> <xsd:element name=”country” type=”xsd:string”/>
>
> <xsd:element name=”city” type=”xsd:string”/>
>
> </xsd:sequence>
>
> </xsd:group>
>
> <xsd:simpleType name=”myQualType”>
>
> <xsd:restriction base=”xsd:string”>
>
> <xsd:enumeration value=”1”/>
>
> <xsd:enumeration value=”2”/>
>
> </xsd:restriction>
>
> </xsd:simpleType>
>
Received on Sunday, 26 May 2002 19:57:45 UTC