W3C home > Mailing lists > Public > xmlschema-dev@w3.org > May 2002

Re: The problem with XML Schema definition

From: Valeri Gavrilovets <valar@rambler.ru>
Date: Mon, 13 May 2002 05:50:07 -0400 (EDT)
Message-ID: <3CDF981B.3B5D949B@rambler.ru>
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

This archive was generated by hypermail 2.3.1 : Wednesday, 7 January 2015 14:55:56 UTC