Re: Substitution groups - replacing required elements in the s.group head

Hi Shane,

You can define an abstract element like:

<xsd:element name="abstractObject" abstract="true"/>

and then use that in the content model of the container:

<xsd:element name="myContainer">
   <xsd:complexType>
     <xsd:sequence>
       <xsd:element ref="abstractObject"/>
     </xsd:sequence>
   </xsd:complexType>
</xsd:element>

Add the myObject in the substitution group for the abstractObject

<xsd:element name="myObject" type="myObjectType" 
substitutionGroup="abstractObject"/>

and do the same for the new myOtherObject element:

<xsd:element name="myOtherObject" type="myOtherObjectType" 
substitutionGroup="abstractObject"/>
<xsd:complexType name="myOtherObjectType">
   <xsd:sequence>
     <xsd:element name="forwardingaddress" type="xsd:string"/>
   </xsd:sequence>
</xsd:complexType>

Hope that helps,
George
-----------------------------------------------
George Cristian Bina
<oXygen/> XML Editor & XSLT Editor/Debugger
http://www.oxygenxml.com


Shane Lauf wrote:
> I am running in to a problem with substitution groups when the substitution
> group head includes a required element. For an element which I would like to
> include in the substitution group, I would like the required element to be
> replaced by a different element which is not substitutable for the required
> element. 
> 
> For example, I have a myObject element (think "postal letter") of type
> myObjectType, defined to include either a "pobox" or some number of
> "streetaddress"es. (i.e. it has to have at least one or the other.)
> 
> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
>   <xsd:element name="myContainer">
>     <xsd:complexType>
>       <xsd:sequence>
>         <xsd:element ref="myObject"/>
>       </xsd:sequence>
>     </xsd:complexType>
>   </xsd:element>
>   <xsd:element name="myObject" type="myObjectType"/>
>   <xsd:complexType name="myObjectType" mixed="true">
>     <xsd:sequence>
>       <xsd:choice>
>         <xsd:element name="pobox" type="string"/>
>         <xsd:element name="streetaddress" type="string"
> maxOccurs="unbounded"/>
>       </xsd:choice>
>     </xsd:sequence>
>   </xsd:complexType>
> </xsd:schema>
> 
> Example usage: 
> <myObject><pobox>12345</pobox></myObject>
> <myObject><streetaddress>12345 Smith Ave.</streetAddress></myObject>
> 
> I would like to define a myOtherObject which can have a "forwardingaddress"
> instead of the "pobox" or "streetaddress"es:
> 
> <myOtherObject><forwardingaddress>12345 Jones
> Ave.</forwardingaddress></myOtherObject>
> 
> The crunch is that I also need myOtherObject to *substitute* for myObject
> under myContainer. However if I declare myOtherObject to have
> substitutionGroup="myObject", it seems to have to be to be a derivation from
> myObjectType - thereby inheriting the requirement to have either a "pobox"
> or a "streetaddress". Is there some way I can:
> 
> * substitute for, without deriving from (extending), myObjectType;
> * extend myObjectType with a minOccurs="0" on the elements in the choice; or
> * extend myObjectType with another possible element (forwardingaddress) in
> the choice
> 
> .... allowing me to get around the one-or-the-other(pobox|streetaddress)
> restriction - and leave the original schema intact?
> 
> SRL
> 
> 

Received on Monday, 2 August 2004 06:12:24 UTC