- From: Valeri Gavrilovets <valar@rambler.ru>
- Date: Mon, 13 May 2002 05:50:07 -0400 (EDT)
- To: xmlschema-dev@w3.org
> Hi Jeni, Thank you very much. It is the best answer I've ever received and I would expect. I agree to all that you 've written. Unfortunately the setuation is worse. Probably you've got that THIS is supposed to be used for the Java object - XML conversion. The Hashtable class represents a unsorted collection of mappings. SO I can not use the sequence compositor. The <xs:all> suites very well but it must be the top level of the complex type. Although I like the first schema you suggested. The second one is too weak from the validation point of view. I would be happy if i had something possible like this: <xs:element name="callResult"> <xs:complexType> <xs:choice> <xs:element name="result" type="OkCase"/> <xs:element name="result" type="ErrorCase"/> </xs:choice> <xs:attribute name="type" type="xs:string" use="required" fixed="java.util.Hashtable"/> </xs:complexType> </xs:element> <xs:complexType name="OkCase"> <xs:all> <xs:element name="KeyA" type="KeyA"/> <xs:element name="KeyB" type="KeyB"/> <xs:element name="KeyC" type="KeyC"/> <xs:element name="STATUS" type="Status" fixed="OK"/> </xs:all> <xs:attribute name="type" type="xs:string" use="required" fixed="java.util.Hashtable"/> </xs:complexType> <xs:complexType name="ErrorCase"> <xs:all> <xs:element name="ERRORS" type="Errors" /> <xs:element name="STATUS" type="Status" fixed="INIT"/> </xs:all> <xs:attribute name="type" type="xs:string" use="required" fixed="java.util.Hashtable"/> </xs:complexType> but it causes Unique Particle Attribution Constraint violation... obviously. Is there some that i could do with it or i go the wrong way? with best regards, Valeri Gavrilovets > ------------------------------------------------------------------------ > > Date: Sun, 12 May 2002 10:05:07 +0100 > From: Jeni Tennison <jeni@jenitennison.com> > Message-ID: <861728833631.20020512100507@jenitennison.com> > To: Valeri Gavrilovets <valar@rambler.ru> > CC: xmlschema-dev@w3.org, ValaR - Netlife <gavrilovets@netlife.de> > Subject: Re: The problem with XML Schema definition > > Hi Valeri, > > > Hopefully anyone helps me by this "trivial" problem. > > I have two kinds of possible xml documents: > > > > First--------- > > > <callResult type="java.util.Hashtable" > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > xsi:noNamespaceSchemaLocation="http://host/schema/newSession.xsd"> > > <result type="java.util.Hashtable"> > > <STATUS>OK</STATUS> > > <Key1>123</Key1> > > <Key2>234</Key2> > > <Key3>324</Key3> > > <Key4>256</Key4> > > </result> > > </callResult> > > > > Second------- > > > > <callResult type="java.util.Hashtable" > > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > > xsi:noNamespaceSchemaLocation="http://host/schema/newSession.xsd"> > > <result type="java.util.Hashtable"> > > <STATUS>INIT</STATUS> > > <ERROR>200</ERROR> > > </result> > > </callResult> > > > > Now the newSession.xsd schema should describe these two kinds of > > xml. Could you help me giving some good ideas? > > Well, at a basic level you've got a callResult element with a type > attribute containing a result element with a type attribute, which > contains a STATUS element and either a ERROR element or a sequence of > Key1 to Key4 elements. You could use: > > <xs:element name="callResult"> > <xs:complexType> > <xs:sequence> > <xs:element name="result"> > <xs:complexType> > <xs:sequence> > <xs:element name="STATUS"> > <xs:simpleType> > <xs:restriction base="xs:token"> > <xs:enumeration value="OK" /> > <xs:enumeration value="INIT" /> > </xs:restriction> > </xs:simpleType> > </xs:element> > <xs:choice> > <xs:element name="ERROR" type="xs:unsignedInt" /> > <xs:sequence> > <xs:element name="Key1" type="xs:unsignedInt" /> > <xs:element name="Key2" type="xs:unsignedInt" /> > <xs:element name="Key3" type="xs:unsignedInt" /> > <xs:element name="Key4" type="xs:unsignedInt" /> > </xs:sequence> > </xs:choice> > </xs:sequence> > <xs:attribute name="type" fixed="java.util.Hashtable" /> > </xs:complexType> > </xs:element> > </xs:sequence> > <xs:attribute name="type" fixed="java.util.Hashtable" /> > </xs:complexType> > </xs:element> > > That's the best that you can do with XML Schema. > > There are a couple of other constraints that I suspect that you want > to be able to articulate. I suspect that you want to say that if the > value of the STATUS element is OK, then you should have the KeyN > elements, but if the value of the STATUS element is INIT, then you > should have the ERROR element. This is an example of a co-occurrence > constraint, and in general XML Schema doesn't support co-occurrence > constraints. They are supported in RELAX NG or in Schematron. In > Schematron, for example, you could use the pattern: > > <sch:pattern context="result"> > <sch:report test="STATUS = 'INIT' and not(ERROR)"> > If STATUS is 'INIT' then there should be an ERROR element. > </sch:report> > <sch:report test="STATUS = 'OK' and ERROR"> > If STATUS is 'OK' then there should not be an ERROR element. > </sch:report> > </sch:pattern> > > The other thing is that I think you probably want to allow the report > element to contain any number of KeyN elements, rather than just four. > To support that in XML Schema, I think your only course of action is > to allow the report element to hold any kind of element, and then test > that (when STATUS is 'OK') all those elements start with 'Key' and end > in a number, something that you can only do in Schematron. The XML > Schema would look like: > > <xs:element name="callResult"> > <xs:complexType> > <xs:sequence> > <xs:element name="result"> > <xs:complexType> > <xs:sequence> > <xs:any processContents="lax" > minOccurs="2" maxOccurs="unbounded" /> > </xs:sequence> > <xs:attribute name="type" fixed="java.util.Hashtable" /> > </xs:complexType> > </xs:element> > </xs:sequence> > <xs:attribute name="type" fixed="java.util.Hashtable" /> > </xs:complexType> > </xs:element> > > <xs:element name="STATUS"> > <xs:simpleType> > <xs:restriction base="xs:token"> > <xs:enumeration value="OK" /> > <xs:enumeration value="INIT" /> > </xs:restriction> > </xs:simpleType> > </xs:element> > > <xs:element name="ERROR" type="xs:unsignedInt" /> > > (The schema would validate STATUS and ERROR elements against their > respective element declarations, but not attempt to validate the > content of KeyN elements.) > > The Schematron rules would look something like: > > <sch:pattern test="report[STATUS = 'OK']/*[not(self::STATUS)]"> > <sch:assert test="starts-with(name(), 'Key')"> > The names of the elements in the report element when STATUS is OK > should all start with 'Key'. > </sch:assert> > <sch:assert test="number(substring-after(name(), 'Key'))"> > The names of the elements in the report element when STATUS is OK > should end with a number. > </sch:assert> > </sch:pattern> > > To be honest, the fact that you're going to have to go to such lengths > to validate this XML format is an indication that it's not designed > very well. Since XML elements are intrinsically ordered, it's better > to design your language so that lists of elements of the same type > don't include numbering information in their names. You should use: > > <callResult type="java.util.Hashtable" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:noNamespaceSchemaLocation="http://host/schema/newSession.xsd"> > <result type="java.util.Hashtable"> > <STATUS>OK</STATUS> > <Key>123</Key> > <Key>234</Key> > <Key>324</Key> > <Key>256</Key> > </result> > </callResult> > > instead, or if you want to keep the number there for easy access, add > it as an attribute: > > <callResult type="java.util.Hashtable" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:noNamespaceSchemaLocation="http://host/schema/newSession.xsd"> > <result type="java.util.Hashtable"> > <STATUS>OK</STATUS> > <Key n="1">123</Key> > <Key n="2">234</Key> > <Key n="3">324</Key> > <Key n="4">256</Key> > </result> > </callResult> > > Cheers, > > Jeni > > --- > Jeni Tennison > http://www.jenitennison.com/ > > ------------------------------------------------------------------------ > > * Next message: Bob Schloss: "Re: The problem with XML Schema definition" > * Previous message: Ross Shaw: "Re: Standard Educational or Financial Schema?" > * In reply to: Valeri Gavrilovets: "The problem with XML Schema definition" > * Next in thread: Bob Schloss: "Re: The problem with XML Schema definition" > * Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] > * Other mail archives: [this mailing list] [other W3C mailing lists] > * Mail actions: [ respond to this message ] [ mail a new topic ]
Received on Monday, 13 May 2002 19:46:57 UTC