- From: George Cristian Bina <george@sync.ro>
- Date: Fri, 03 Sep 2004 10:31:13 +0300
- To: Shane Lauf <srl01@uow.edu.au>
- CC: xmlschema-dev@w3.org
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 07:29:39 UTC