Re: Extending abstract elements with a choice

George,

I knew there had to be something wrong ;-). Can you recommend a more
comprehensive schema validator that will make sure I don't fall into these
traps again?

Shane


> -----Original Message-----
> From: George Cristian Bina [mailto:george@sync.ro]
> Sent: Friday, September 03, 2004 5:31 PM
> To: Shane Lauf
> Cc: xmlschema-dev@w3.org
> Subject: Re: Extending abstract elements with a choice
> 
> Hi Shane,
> 
> Your schema is not valid. You cannot restrict a sequence with a choice,
> this is forbidden, see
> http://www.w3.org/TR/xmlschema-1/#cos-particle-restrict
> 
> If you use extension instead of restriction then your schema is also
> invalid as it violates the Unique Particle Attribution
> http://www.w3.org/TR/xmlschema-1/#cos-nonambig
> 
> the content model will be:
> ((Object1{0-1}, Object2{0-1}), (SpecialObject1 | (Object1, Object2)))
> 
> and when the parser encounters Object1 it will not know what particle to
> follow, either Object1{0-1} or Object1.
> 
> Hope that helps,
> George
> -----------------------------------------------
> George Cristian Bina
> <oXygen/> XML Editor & XSLT Editor/Debugger
> http://www.oxygenxml.com
> 
> Shane Lauf wrote:
> > George,
> >
> > Thanks again for your help. Your approach worked perfectly, though I now
> > realise there was a bug in my original question. In the "semantically
> > equivalent to..." bit, it should have been
> >        <xsd:element ref="Object1"/>
> >        <xsd:element ref="Object2"/>
> > i.e. without the minOccurs="0" on each of these. I changed this in your
> > solution and it started giving me the (correct) validation errors I was
> > hoping for when the child elements weren't present in myConcreteElement.
> >
> > That said, I think I may have managed to do it in one go without the tmp
> > Type.
> >
> > <?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="myConcreteElement"
> > substitutionGroup="myAbstractElement">
> >   <xsd:complexType>
> >    <xsd:complexContent>
> >     <xsd:restriction base="myAbstractElementType">
> >      <xsd:choice>
> >       <xsd:element ref="SpecialObject1"/>
> >       <xsd:sequence>
> >        <xsd:element ref="Object1"/>
> >        <xsd:element ref="Object2"/>
> >        <!-- note - had to remove the minOccurs="0" on these two-->
> >       </xsd:sequence>
> >      </xsd:choice>
> >     </xsd:restriction>
> >    </xsd:complexContent>
> >   </xsd:complexType>
> >  </xsd:element>
> >  <xsd:element name="Object1"/>
> >  <xsd:element name="Object2"/>
> >  <xsd:element name="SpecialObject1"/>
> > </xsd:schema>
> >
> > With this, the following file (correctly) fails in the same way as your
> > method, with the error "Require mandatory child elements (SpecialObject1
|
> > (Object1, Object2))" using both XMLSpy and MSV.
> >
> > <?xml version="1.0" encoding="UTF-8"?>
> > <test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> > xsi:noNamespaceSchemaLocation="test.xsd">
> > 	<myConcreteElement></myConcreteElement>
> > </test>
> >
> > Is this a valid way of doing things, or am I missing something?
> > Interestingly, it works exactly the same doing myConcreteElement as an
> > extension on myAbstractElement instead of as a restriction.
> >
> > Thanks again,
> >
> > Shane
> >
> >
> >
> >>-----Original Message-----
> >>From: George Cristian Bina [mailto:george@sync.ro]
> >>Sent: Thursday, September 02, 2004 7:54 PM
> >>To: Shane Lauf
> >>Cc: xmlschema-dev@w3.org
> >>Subject: Re: Extending abstract elements with a choice
> >>
> >>Hi Shane,
> >>
> >> > There's
> >> > no way to do it in one go (i.e. without the tmp element), right?
> >>
> >>That is a type not an element. AFAIK yes, you need to have an additional
> >>type.
> >>
> >>Best Regards,
> >>George
> >>-----------------------------------------------
> >>George Cristian Bina
> >><oXygen/> XML Editor & XSLT Editor/Debugger
> >>http://www.oxygenxml.com
> >>
> >>Shane Lauf wrote:
> >>
> >>>George,
> >>>
> >>>Thanks very much for the quick reply on this - I'll give it a try.
> >
> > There's
> >
> >>>no way to do it in one go (i.e. without the tmp element), right?
> >>>
> >>>Shane
> >
> >
> >
> >

Received on Friday, 3 September 2004 08:38:15 UTC