Re: elements with the same name

> I would do it like so:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema" elementFormDefault="qualified">
>  <xsd:element name="top">
>   <xsd:complexType>
>    <xsd:sequence>
>     <xsd:element name="Address" type="US"/>
>     <xsd:element name="Address" type="China"/>
>    </xsd:sequence>
>   </xsd:complexType>
>  </xsd:element>
>  <xsd:complexType name="US">
>   <xsd:sequence>
>    <xsd:element name="Street" type="xsd:string"/>
>    <xsd:element name="City" type="xsd:string"/>
>    <xsd:element name="Zip" type="xsd:string"/>
>   </xsd:sequence>
>  </xsd:complexType>
>  <xsd:complexType name="China">
>   <xsd:sequence>
>    <xsd:element name="Street" type="xsd:string"/>
>    <xsd:element name="City" type="xsd:string"/>
>    <xsd:element name="Province" type="xsd:string"/>
>   </xsd:sequence>
>  </xsd:complexType>
> </xsd:schema>

This is not a valid schema. You can't have two elements with the same name (Address) in the
same content model with different types (also it's using the old CR namespace). Instead of the
above solution you would create an abstract complexType to hold the common element in the
different Address types like:

<xsd:complexType name="baseAddressType" abstract="true">
   <xsd:sequence>
      <xsd:element name="Street" type="xs:string"/>
      <xsd:element name="City" type="xs:string"/>
   </xsd:sequence>
</xsd:complexType>

This is the type you will use for the Address element:

<xsd:element name="top">
   <xsd:complexType>
      <xsd:sequence>
         <xsd:element name="Address" type="baseAddressType" minOccurs="2" maxOccurs="2"/>
      </xsd:sequence>
   </xsd:complexType>
</xsd:element>

The you create your specific address types by extending the baseAddressType. The complete
schema would look like:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
 <xsd:element name="top">
  <xsd:complexType>
   <xsd:sequence>
    <xsd:element name="Address" type="baseAddressType" minOccurs="2" maxOccurs="2"/>
   </xsd:sequence>
  </xsd:complexType>
 </xsd:element>
 <xsd:complexType name="baseAddressType" abstract="true">
  <xsd:sequence>
   <xsd:element name="Street" type="xsd:string"/>
   <xsd:element name="City" type="xsd:string"/>
  </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="US">
  <xsd:complexContent>
   <xsd:extension base="baseAddressType">
    <xsd:sequence>
     <xsd:element name="Zip" type="xsd:string"/>
    </xsd:sequence>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>
 <xsd:complexType name="China">
  <xsd:complexContent>
   <xsd:extension base="baseAddressType">
    <xsd:sequence>
     <xsd:element name="Province" type="xsd:string"/>
    </xsd:sequence>
   </xsd:extension>
  </xsd:complexContent>
 </xsd:complexType>
</xsd:schema>

The instance document would stay the same but change the namespace to the Rec version
(http://www.w3.org/2001/XMLSchema-instance)

Cheers,
/Eddie

> Then your XML would look like this:
> <top xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
>  <Address xsi:type="US">
>   <Street>12345 main street</Street>
>   <City>JoeTown</City>
>   <Zip>2456</Zip>
>  </Address>
>  <Address xsi:type="China">
>   <Street>12344 lo pai street</Street>
>   <City>...</City>
>   <Province>..</Province>
>  </Address>
> </top>

Received on Tuesday, 28 August 2001 19:57:50 UTC