Re: Extending abstract elements with a choice

Hi Shane,

I guess can do that with a restriction to an empty content model and then
extend that to your desired content model:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="test">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="myAbstractElement"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="myAbstractElement" type="myAbstractElementType"
abstract="true"/>
  <xsd:complexType name="myAbstractElementType">
    <xsd:sequence>
      <xsd:element ref="Object1" minOccurs="0"/>
      <xsd:element ref="Object2" minOccurs="0"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="Object1"/>
  <xsd:element name="Object2"/>
  <xsd:complexType name="tmp">
    <xsd:complexContent>
      <xsd:restriction base="myAbstractElementType"/>
    </xsd:complexContent>
  </xsd:complexType>
  <xsd:element name="myConcreteElement"
substitutionGroup="myAbstractElement">
    <xsd:complexType>
      <xsd:complexContent>
        <xsd:extension base="tmp">
          <xsd:choice>
            <xsd:element ref="SpecialObject1"/>
            <xsd:sequence>
              <xsd:element ref="Object1" minOccurs="0"/>
              <xsd:element ref="Object2" minOccurs="0"/>
            </xsd:sequence>
          </xsd:choice>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="SpecialObject1"/>
</xsd:schema>


<?xml version="1.0"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="test.xsd">
  <myConcreteElement>
    <SpecialObject1></SpecialObject1>
  </myConcreteElement>
</test>

Best Regards,
George
-------------------------------------------------------
George Cristian Bina mailto:george@oxygenxml.com
<oXygen/> XML Editor and XSLT Editor/Debugger
http://www.oxygenxml.com/


----- Original Message -----
From: "Shane Lauf" <srl01@uow.edu.au>
To: <xmlschema-dev@w3.org>
Sent: Thursday, September 02, 2004 5:24 AM
Subject: Extending abstract elements with a choice


>
> I have a question about extending abstract elements with a choice, and
> maintaining substitutability.
>
> Say I have an abstract element myAbstractElement, defined with some child
> elements which all have minOccurs=0 attributes set.
>
>       <xsd:sequence>
>        <xsd:element ref="Object1" minOccurs="0"/>
>        <xsd:element ref="Object2" minOccurs="0"/>
>       </xsd:sequence>
>
> Is there a way that I can extend/restrict myAbstractElement to another
> element myConcreteElement, which ends up with a definition semantically
> equivalent to:
>      <xsd:sequence>
>      <xsd:choice>
>       <xsd:element ref="SpecialObject1"/>
>       <xsd:sequence>
>        <xsd:element ref="Object1" minOccurs="0"/>
>        <xsd:element ref="Object2" minOccurs="0"/>
>       </xsd:sequence>
>      </xsd:choice>
>     </xsd:sequence>
>
> - in otherwords, so that myConcreteElement must have one or the other of
> [the child elements as defined in myAbstractElement i.e. Object1 and
Object
> 2], [a SpecialObject1 child] - and still be substitutable for
> myAbstractElement?
>
> Regards,
>
> Shane
>
>
>

Received on Thursday, 2 September 2004 03:12:31 UTC