W3C home > Mailing lists > Public > xmlschema-dev@w3.org > April 2009

RE: How to improve XSD for a list with differently typed items + multiplicity and uniqueness constraints

From: Michael Kay <mike@saxonica.com>
Date: Thu, 23 Apr 2009 09:56:54 +0100
To: <gvt.junk@free.fr>, <xmlschema-dev@w3.org>
Message-ID: <8D2137755922443E90718E9305A7F075@Sealion>
> Here are the rules the schema shall enforce for the <LIST> element:
> 1. The list allows a limited set of items;
>    (say: <ITEM_A>, <ITEM_B> and <ITEM_C>) 
  2. The list does 
> not allow duplicate items (same element name);
>    (items <ITEM_A>, <ITEM_B> and <ITEM_C> can only occur 0 or 1 time in
> list)
> 3. Order of items in the list does not matter; 
  4. The list 
> must contain at least 1 item (among: <ITEM_A>, <ITEM_B> and 
> <ITEM_C>); 
  5. The content of item elements is typed and "data 
> type" is psecific to each item;
>    (e.g.: <ITEM_A> contains integer data, while <ITEM_B> 
> contains string and <ITEM_C> a complex type)
> Is there any chance to write an alternate XML schema that 
> enforce all these rules, but produce "better-looking" 
> compliant document that would look like the following one, 
> with reduced nesting levels?
> Really, I'm not convinced it is possible with XML schema...
> <LIST>
>   <ITEM_B>100</ITEM_B>
>   <ITEM_A>0</ITEM_A>
>   <ITEM_C>aa-123</ITEM_C>
> </LIST>

Using xs:all will allow this instance, and satisfy all your constraints
except (4).

Using xs:choice with a repetition (or equivalently, a substitution group)
will allow this instance, and satisfy all your constraints except (2).

I think that to enforce both (2) and (4) simultaneously you probably need
XSD 1.1 assertions. You could then use xs:all with the additional assertion
test="count(*) ge 1", or xs:choice with the additional assertion
test="count(*) eq count(distinct-values(*/node-name()))".

Michael Kay
Received on Thursday, 23 April 2009 08:57:33 UTC

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