Altova Mailing List Archives


Re: [xml-dev] choice, sequence, all: 'easy' XML Schema question

From: "Rick Jelliffe" <ricko@-------.---.-->
To: xml-dev@-----.---.---
Date: 2/16/2005 6:44:00 PM
> John Graybeal wrote:
>> We are writing XML of the form:
>>
>> <element>
>>    <required_element/>
>>    <optional_element1/>
>>    <optional_element2/>
>> </element>
>>
>> We would like to specify (for example), that there can be only one of
>> required_element, only one of optional_element1, but as many as desired
>> of optional_element2.  Plus, we would like to be able to specify the
>> elements in any order.

XML Schemas is a grammar-based schema language, which brings with it
a lot of limitations as far as modeling capabilities. It has some
extensions (as does RELAX NG) to make it easier to declare some
simple structures which are otherwise cumbersome to express in regular
grammars. In particular, grammars typically use element position to key
occurrence, which makes it difficult to model when occurrences are
position-independent.

The advantage of using a grammar is that validation and processing can
be performed using automata and other techniques, which are theoretically
well understood. (How much this actually helps implementations to be good
is another matter.)

Many people who use XML Schemas and DTDs (& RELAX NG to a lesser extent)
come to the realization that they are better off only modelling in
grammars the kinds of constraints that grammars lend themselves to, and to
add additional constraints in a different language. For example, you might
model in your XML Schema the equivalent (in DTD notation) of
  <!ELEMENT element
       (required_element | optional_element | optional_element3)*>
then add the following Schematron schema to validate the other constraints"

<schema xmlns="http://www.ascc.net/xml/schematron">

  <title>Example for John Graybeal</title>

  <pattern>
    <rule context="element">

      <assert test="count(required_element)=1">
      There must be one required_element</assert>

      <assert test="count(optional_element)&lt;=1">
      There may be one optional_element</assert>

    </rule>
  </pattern>
</schema>

See Schematron.com for info on Schematron.

Cheers
Rick Jelliffe

Disclaimer

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.