W3C home > Mailing lists > Public > xmlschema-dev@w3.org > October 2007

Re: optional, but at least one required

From: George Cristian Bina <george@oxygenxml.com>
Date: Thu, 11 Oct 2007 14:24:19 +0300
Message-ID: <470E07E3.5060703@oxygenxml.com>
To: Marie Bilde Rasmussen <mariebilderas@gmail.com>
Cc: Pete Cordell <petexmldev@tech-know-ware.com>, Virginia Wiswell <vwiswell@verizon.net>, xmlschema-dev@w3.org

While waiting for XML Schema 1.1 one can use Schematron embedded in XML 
schema. For instance test -> (a*, b*, c*) but with at least one element 
present can be written as:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:sch="http://purl.oclc.org/dsdl/schematron">
   <xs:element name="a"/>
   <xs:element name="b"/>
   <xs:element name="c"/>
   <xs:element name="test">
     <xs:annotation>
       <xs:appinfo>
         <sch:pattern id="atLeastOne">
           <sch:rule context="test">
             <sch:assert test="count(*)>0">At least one of a, b or c 
must appear inside test.</sch:assert>
           </sch:rule>
         </sch:pattern>
       </xs:appinfo>
     </xs:annotation>
     <xs:complexType>
       <xs:sequence>
         <xs:element ref="a" minOccurs="0" maxOccurs="unbounded"/>
         <xs:element ref="b" minOccurs="0" maxOccurs="unbounded"/>
         <xs:element ref="c" minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
     </xs:complexType>
   </xs:element>
</xs:schema>

Best Regards,
George
---------------------------------------------------------------------
George Cristian Bina - http://aboutxml.blogspot.com/
<oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
http://www.oxygenxml.com


Marie Bilde Rasmussen wrote:
> This syntactic workaround used to avoid UPA violation: (ab*|b) used to
> express (a|ab|b) is the only way I know of  to solve the problem.
> 
> 
> 
> But I do think that schemas become harder to construct and very much harder
> to read and communicate about when reformulated like this.
> 
> 
> And, just as Virginia, I could use a constraint on a sequence- or
> choice-element, saying that "it should contain something" (i.e. at least one
> child element) to be valid, even though all the members were optional,
> something like
> 
> 
> 
> 
> My impression is that the negavtive impact on construction and readability
> grows very fast when the number of alternatives raises.
> 
> 
> 
> Consider the case where we must apply the same requirements to a larger
> number of elements. In my dictionary-data, I require, that entries for
> homonyms are sorted after their part of speech, e.g. common nouns before
> proper nouns before verbs before prepositions. There kan be 0, 1 or more
> entries of every type, but my homonyms-element must contain at least one
> entry. I would love to write:
> 
> 
> 
> <xsd:element name="homonyms">
> 
> <xsd:sequence>
> 
>       <xsd:element ref="commonNoun-entry minOccurs="0"
> maxOccurs="unbounded"/>
> 
>       <xsd:element ref="properNoun-entry minOccurs="0"
> maxOccurs="unbounded"/>
> 
>       <xsd:element ref="verb-entry minOccurs="0" maxOccurs="unbounded"/>
> 
>       <xsd:element ref="preposition-entry minOccurs="0"
> maxOccurs="unbounded"/>
> 
> </xsd:sequence>
> 
> </xsd:element>
> 
> 
> 
> and be able to express some "at least one entry"-constraint at the
> <xsd:sequence>-level
> 
> 
> 
> But I cannot do this, so I have to implement my rule this way:
> 
> 
> 
> <xsd:element name="homonyms">
> 
> <xsd:choice>
> 
> <xsd:sequence>
> 
>       <xsd:element ref="commonNoun-entry maxOccurs="unbounded"/>
> 
>       <xsd:element ref="properNoun-entry minOccurs="0"
> maxOccurs="unbounded"/>
> 
>       <xsd:element ref="verb-entry minOccurs="0" maxOccurs="unbounded"/>
> 
>       <xsd:element ref="preposition-entry minOccurs="0"
> maxOccurs="unbounded"/>
> 
> </xsd:sequence>
> 
> <xsd:sequence>
> 
>       <xsd:element ref="properNoun-entry maxOccurs="unbounded"/>
> 
>       <xsd:element ref="verb-entry minOccurs="0" maxOccurs="unbounded"/>
> 
>       <xsd:element ref="preposition-entry minOccurs="0"
> maxOccurs="unbounded"/>
> 
> </xsd:sequence>
> 
> <xsd:sequence>
> 
>       <xsd:element ref="verb-entry maxOccurs="unbounded"/>
> 
>       <xsd:element ref="preposition-entry minOccurs="0"
> maxOccurs="unbounded"/>
> 
> </xsd:sequence>
> 
> <xsd:sequence>
> 
>       <xsd:element ref="preposition-entry maxOccurs="unbounded"/>
> 
> </xsd:sequence>
> 
> </xsd:choice>
> 
> </xsd:element>
> 
> 
> 
> In real life, we have about 15 different kinds of entries, so you can
> imagine how overwhelming that part of the schema is.
> 
> 
> I guess some of you will now tell me to use Relax NG instead. Unfortunatley,
> I don't have that option. So I am not asking for an answer or solution,  I
> would just like to hear some opinions on the issues.
> 
> 
> -Marie
> 
> 
> 
> **********
> 
> Marie Bilde Rasmussen
> 
> editor, MA BSc
> 
> Gyldendal Publishers, Copenhagen (Denmark)
> 
> (dictionaries)
> 
> www.gyldendal.dk
> 
> **********
> 
> 
> 2007/10/11, Pete Cordell <petexmldev@tech-know-ware.com>:
>>
>> To be pedantic, removing the second <xsd:element ref="a"/> prevents the
>> Unique Particle Attribution violation for _a_.  We then need to work
>> around
>> this change by adding minOccurs="0" to element b so we allow what we want.
>>
>> :-),
>>
>> Pete.
>> ----- Original Message -----
>> From: "Virginia Wiswell" <vwiswell@verizon.net>
>> To: "Pete Cordell" <petexmldev@tech-know-ware.com>; "Virginia Wiswell"
>> <vwiswell@verizon.net>
>> Cc: <xmlschema-dev@w3.org>
>> Sent: Thursday, October 11, 2007 2:35 AM
>> Subject: Re: optional, but at least one required
>>
>>
>>> So the minOccurs="0" on element b prevents the Unique Particle
>> Attribution
>>> violation for b?
>>>
>>> This is perfect, Pete. Thanks so much for helping me out.
>>>
>>> On Wed, 10 Oct 2007 19:22:51 +0100
>>>  "Pete Cordell" <petexmldev@tech-know-ware.com> wrote:
>>>> Hi Virginia,
>>>>
>>>> Your schema should indeed yield a Unique Particle Attribution
>> violation.
>>>> The reason is that when a parser reads element a, it is not immediately
>>>> obvious whether it corresponds to the first definition of a or the
>>>> second.
>>>>
>>>> You can get around this by changing your schema to:
>>>>
>>>>  <xsd:element name="parent">
>>>>   <xsd:complexType>
>>>>    <xsd:choice>
>>>>      <xsd:sequence>
>>>>        <xsd:element ref="a"/>
>>>>        <xsd:element ref="b" minOccurs="0"/>
>>>>      </xsd:sequence>
>>>>      <xsd:element ref="b"/>
>>>>    </xsd:choice>
>>>>   </xsd:complexType>
>>>>  </xsd:element>
>>>>
>> --
>> =============================================
>> Pete Cordell
>> Codalogic
>> for XML Schema to C++ data binding visit
>> http://www.codalogic.com/lmx/
>> =============================================
>>
>>
>>
>>
> 
Received on Thursday, 11 October 2007 11:26:37 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Tuesday, 11 January 2011 00:15:00 GMT