- From: George Cristian Bina <george@sync.ro>
- Date: Tue, 03 Aug 2004 09:10:21 +0300
- To: Shane Lauf <srl01@uow.edu.au>
- Cc: xmlschema-dev@w3.org
Hi Shane,
I think that is not possible, the main reason being that the particle
that defines the myObjectType is not emptiable. If you add for instance
a minOccurs="0" like below:
<xsd:complexType name="myObjectType" mixed="true">
<xsd:sequence>
<xsd:choice minOccurs="0">
<xsd:element name="pobox" type="xsd:string"/>
<xsd:element name="streetaddress" type="xsd:string"
maxOccurs="unbounded"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>
then you should be able to extend the myObjectType to add the
forwardingaddress element:
<xsd:complexType name="tmpType" mixed="true">
<xsd:complexContent>
<xsd:extension base="myObjectType">
<xsd:sequence>
<xsd:element name="forwardingaddress" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
and then restrict it to remove the pobox and streetaddress in the
myOtherObjectType:
<xsd:complexType name="myOtherObjectType" mixed="true">
<xsd:complexContent>
<xsd:restriction base="tmpType">
<xsd:sequence>
<xsd:element name="forwardingaddress" type="xsd:string"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
Now you should be able to add the myOtherObject in the substitution
group of myObject:
<xsd:element name="myOtherObject" type="myOtherObjectType"
substitutionGroup="myObject"/>
Best Regards,
George
-----------------------------------------------
George Cristian Bina
<oXygen/> XML Editor & XSLT Editor/Debugger
http://www.oxygenxml.com
Shane Lauf wrote:
> Thanks George. If there's no way to go forward without
> changing the original schema as well, then the abstract
> elements idea sounds like it will be the best solution. I'd
> like to exhaust the other options (which leave the original
> schema intact) first though. Can you think of anything else
> ("extending" with a minOccurs="0", or something?) that might
> be feasible?
>
> Regards,
>
> Shane
>
> ---- Original message ----
>
>>Date: Mon, 02 Aug 2004 13:13:16 +0300
>>From: George Cristian Bina <george@sync.ro>
>>Subject: Re: Substitution groups - replacing required
>
> elements in the s.group head
>
>>To: Shane Lauf <srl01@uow.edu.au>
>>Cc: xmlschema-dev@w3.org
>>
>>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 Tuesday, 3 August 2004 02:10:16 UTC