CaseWiki:RelaxNG

This site uses Relax NG to define the XML structure for embedded elements. An attempt was made to use XML Schema, however the lack of maxOccurs="unbounded" for an <all> made things rather difficult. Relax NG appears easier to read anyway.

<?xml version='1.0' encoding='ISO-8859-1'?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  
  <start>
    <choice>
      <element name="building">
        <ref name="buildingType" />
      </element>
      <element name="foodProvider">
        <ref name="foodProviderType" />
      </element>
      <element name="department">
        <ref name="departmentType" />
      </element>
      <element name="office">
        <ref name="officeType" />
      </element>
    </choice>
  </start>    

  <define name="buildingType">
    <interleave>
      <element name="name">
        <text />
      </element>
      <optional>
        <element name="wiki">
           <text />
        </element>
      </optional>
      <element name="abbr">
        <text />
      </element>
      <optional>
        <element name="floors">
          <data type="integer" />
        </element>
      </optional>
      <optional>
        <element name="built">
          <data type="integer" />
        </element>
      </optional>
      <optional>
        <element name="destroyed">
          <data type="integer" />
        </element>
      </optional>
      <optional>
        <element name="location">
          <ref name="locationElement" />
        </element>
      </optional>
    </interleave>
  </define>

  <define name="foodProviderType">
    <interleave>
      <element name="name">
        <text />
      </element>
      <optional>
         <element name="wiki">
            <text />
         </element>
      </optional>
      <optional>
        <element name="menu">
          <ref name="foodProviderMenu" />
        </element>
      </optional>
      <optional>
        <element name="location">
          <ref name="locationElement" />
        </element>
      </optional>
    </interleave>
  </define>
  
  <define name="foodProviderMenu">
    <oneOrMore>
      <element name="item">
        <ref name="foodProviderMenuItem" />
      </element>
    </oneOrMore>
  </define>
  
  <define name="foodProviderMenuItem">
    <interleave>
      <element name="name">
        <text />
      </element>
      <element name="description">
        <text />
      </element>
      <element name="cost">
        <data type="decimal" />
      </element>
    </interleave>
  </define>

  <define name="departmentType">
    <interleave>
      <element name="name">
        <text />
      </element>
      <optional>
         <element name="wiki">
            <text />
         </element>
      </optional>
      <optional>
        <element name="abbr">
          <text />
        </element>
      </optional>
      <zeroOrMore>
        <element name="location">
          <ref name="locationElement" />
        </element>
      </zeroOrMore>
    </interleave>
  </define>
  
  <define name="officeType">
    <interleave>
      <element name="name">
        <text />
      </element>
      <optional>
        <element name="wiki">
          <text />
        </element>
      </optional>
      <zeroOrMore>
        <element name="location">
          <ref name="locationElement" />
        </element>
      </zeroOrMore>
    </interleave>
  </define>
  
  <define name="locationElement">
    <choice>
      <ref name="buildingLocation" />
      <ref name="geoLocation" />
    </choice>
  </define>
  
  <define name="buildingLocation">
    <element name="wiki">
      <text />
    </element>
    <optional>
      <element name="floor">
        <!-- 0 or 1 is ground floor; negative signifies basement -->
        <data type="integer" />
      </element>
    </optional>
  </define>
  
  <define name="geoLocation">
    <interleave>
      <element name="lat">
        <data type="decimal" />
      </element>
      <element name="lon">
        <data type="decimal" />
      </element>
      <optional>
        <element name="alt">
          <data type="decimal" />
        </element>
      </optional>
    </interleave>
  </define>
  
</grammar>
This page has been accessed 1,594 times.
This page was last modified 09:09, July 28, 2005 by Gregory Szorc.
About | Disclaimers