[XML-DEV Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Must DTDs constrain order?

  • From: Rick JELLIFFE <ricko@g...>
  • To: xml-dev@l...
  • Date: Sun, 29 Oct 2000 16:07:03 +0800

dtds that use sgml
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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
 

Stylus Studio has published XML-DEV in RSS and ATOM formats, enabling users to easily subcribe to the list from their preferred news reader application.


Stylus Studio Sponsored Links are added links designed to provide related and additional information to the visitors of this website. they were not included by the author in the initial post. To view the content without the Sponsor Links please click here.

Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.