OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

 


 

   Re: Must DTDs constrain order?

[ Lists Home | Date Index | Thread Index ]
  • From: Rick JELLIFFE <ricko@geotempo.com>
  • To: xml-dev@lists.xml.org
  • Date: Sun, 29 Oct 2000 16:07:03 +0800

Wayne Steele wrote:
> 
> I have had to deal with this frequently.
> Here are several choices I've made at different times:
> 
>    1. Express the {baz,bar,bang} information using attributes instead of
> elements.
> 
>    2. As Soumitra said, use <!ELEMENT foo (bar |  bat  | bang)*>
>       I would put a comment next to this, as well:
>          <!-- no more than one of each of these, in any order -->
> 
>    3. Do the combinatorial explosion yourself. You would probably also want
> to include a comment so human DTD readers can figure out what's going on
> without too much pain.
>   <!-- foo must contain one of each of {bar,baz,bang} in any order -->
>   <!ELEMENT foo (
>             (bar, ((baz,bang)|(bang,baz)) ) |
>             (baz, ((bar,bang)|(bang,bar)) ) |
>             (bang,((bar,baz) |(baz,bar))  )
>            ) >
> 
>    4. Use SGML instead of XML for this application, and use "&".
> 
> Ha Ha! Ok, I've never actually used SGML outside of XML. I was just kidding.
 
You may find SGML easier than you think.  XML was designed to be small.
Don't be surprised when you find examples that are too big for it

Given that XML DTDs are a little tedious for this, and that XML Schemas
may be overkill, you might consider using Schematron schemas.  These
simply make assertions using XPaths rather than trying to squeeze what
you need into a regular grammar.

For example, for the example above, here is the Schematron schema
fragment that does the job.  (To understand the example, it may help to
know that the context is an XPath expressions, and the test is an XSLT
expression which is evaluated in that context: so "bar" in a test means,
"bar, the child of foo".)

   <rule context="foo">
      <assert test="count(bar)=1" >A foo must have one bar</assert>
      <assert test="count(bat) &lt; 2">A foo may have 0 or 1
bat</assert>
      <assert test="count(*)=count(bar)+count(bat)+count(bang)"
        >A foo may only contain bar, bat and bang elements</assert>
   </rule>

The schematron site is currently
  http://www.ascc.net/xml/resource/schematron/schematron.html

(We are currently upgrading it to prepare for the move to Source Forge
real soon, and site maintenance at Academia Sinica means it is off the
air this weekend.)

Cheers
Rick Jelliffe




 

News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 2001 XML.org. This site is hosted by OASIS