Project Index | Documentation | Relax NG | Sample XML File
<!-- =========================================== -->
<!-- CIS97YT Midterm 1 -->
<!-- File: chang_k_midterm1.rng -->
<!-- Subject: Creating and Using an RNG File -->
<!-- Written by: Ko Chang -->
<!-- Date: 05/29/2002 -->
<!-- =========================================== -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<element name="world-factbook">
<element name="country-list">
<oneOrMore>
<element name="country">
<element name="name">
<text/>
</element>
<ref name="Profile"/>
</element> <!-- end country element -->
</oneOrMore>
</element> <!-- end country-list element -->
</element> <!-- end world-factbook element -->
</start>
<!-- define Profile reference -->
<define name="Profile">
<element name="profile">
<ref name="Introduction"/>
<ref name="Geography"/>
<ref name="People"/>
<ref name="Government"/>
<ref name="Economy"/>
<attribute name="name"/>
<attribute name="code">
<data type="ID"/>
</attribute>
</element> <!-- end of profile element -->
</define>
<!-- end of Profile reference -->
<!--define Introduction reference -->
<define name="Introduction">
<element name="introduction">
<element name="background">
<interleave>
<text/>
<zeroOrMore>
<ref name="Inline"/>
</zeroOrMore>
<zeroOrMore>
<ref name="Paragraph"/>
</zeroOrMore>
</interleave>
</element>
</element> <!-- end of introduction element -->
</define>
<!-- end of Introduction reference -->
<!-- define Geography reference -->
<define name="Geography">
<element name="geography">
<element name="location">
<text/>
</element>
<interleave>
<element name="coordinates">
<empty/>
<attribute name="latitude">
<data type="string">
<param name="pattern">([1-9]|[12]\d|3[0-5])?\d \d{2} [NS]</param>
</data>
</attribute>
<attribute name="longitude">
<data type="string">
<param name="pattern">([1-9]|[12]\d|3[0-5])?\d \d{2} [EW]</param>
</data>
</attribute>
</element> <!-- end of coordinates element -->
<element name="area">
<element name="total">
<ref name="Area"/>
</element>
<element name="land">
<ref name="Area"/>
</element>
<element name="water">
<ref name="Area"/>
</element>
</element> <!-- end of area element -->
<element name="climate">
<interleave>
<text/>
<zeroOrMore>
<ref name="Inline"/>
</zeroOrMore>
</interleave>
</element> <!-- end of climate element -->
<optional>
<element name="note">
<interleave>
<text/>
<zeroOrMore>
<ref name="Inline"/>
</zeroOrMore>
<zeroOrMore>
<ref name="Paragraph"/>
</zeroOrMore>
</interleave>
</element>
</optional> <!-- end of note element -->
</interleave>
</element> <!-- end of geography element -->
</define>
<!-- end of Geography reference -->
<!-- define People reference -->
<define name="People">
<element name="people">
<element name="population">
<data type="string">
<param name="pattern">\d{1,3}(,\d{3})*</param>
</data>
</element> <!-- end of population element -->
<element name="age-structure">
<element name="y0-14">
<ref name="Age"/>
</element>
<element name="y15-64">
<ref name="Age"/>
</element>
<element name="y65plus">
<ref name="Age"/>
</element>
</element> <!-- end of age-structure element -->
<element name="sex-ratio">
<attribute name="total">
<data type="decimal">
<param name="minExclusive">0</param>
</data>
</attribute>
<attribute name="stat">
<value type="string">male(s)/female</value>
</attribute>
</element> <!-- end of sex-ratio element -->
<element name="nationality">
<text/>
</element> <!-- end of nationality element -->
<element name="ethnic">
<text/>
<zeroOrMore>
<ref name="List"/>
</zeroOrMore>
</element> <!-- end of ethnic element -->
<element name="religions">
<text/>
<zeroOrMore>
<ref name="List"/>
</zeroOrMore>
</element> <!-- end of religions element -->
<element name="language">
<text/>
<zeroOrMore>
<ref name="List"/>
</zeroOrMore>
</element> <!-- end of language element -->
</element> <!-- end of people element -->
</define>
<!-- end of People reference -->
<!-- define Government reference -->
<define name="Government">
<element name="government">
<element name="name">
<element name="conventional-long">
<text/>
</element>
<element name="conventional-short">
<text/>
</element>
</element> <!-- end of name element -->
<element name="type">
<text/>
</element> <!-- end of type elelment -->
<element name="capital">
<text/>
</element> <!-- end of capital elelment -->
<element name="independence">
<element name="date">
<optional>
<element name="month"><text/></element>
</optional>
<optional>
<element name="day"><text/></element>
</optional>
<element name="year"><text/></element>
</element>
</element> <!-- end of independence element -->
<element name="suffrage">
<text/>
</element>
</element> <!-- end of government element -->
</define>
<!-- end of Government reference -->
<!-- define Economy reference -->
<define name="Economy">
<element name="economy">
<element name="overview">
<interleave>
<text/>
<zeroOrMore>
<ref name="Inline"/>
</zeroOrMore>
<zeroOrMore>
<ref name="Paragraph"/>
</zeroOrMore>
</interleave>
</element> <!-- end of overview element -->
<interleave>
<element name="gdp">
<empty/>
<ref name="Amount"/>
</element> <!-- end of gdp element -->
<element name="labor-force">
<data type="string">
<param name="pattern">\d{1,3}(,\d{3})*(\.\d{1,2})?( [bm]illion)?</param>
</data>
</element> <!-- end of labor-force element -->
<element name="export">
<empty/>
<ref name="Amount"/>
</element> <!-- end of export element -->
<element name="import">
<empty/>
<ref name="Amount"/>
</element> <!-- end of import element -->
<element name="currency">
<text/>
</element> <!-- end of currency element -->
<element name="exchange-rate">
<data type="decimal">
<param name="minExclusive">0</param>
</data>
<attribute name="base">
<value type="string">per US dollar</value>
</attribute>
</element> <!-- end of exchange-rate element -->
</interleave>
</element> <!-- end of economy element -->
</define>
<!-- end of Economy reference -->
<!-- define Area reference -->
<define name="Area">
<data type="string">
<param name="pattern">\d{1,3}(,\d{3})* sq (km|mile)</param>
</data>
</define>
<!-- end of define Area reference -->
<!-- define Age reference -->
<define name="Age">
<data type="decimal">
<param name="minExclusive">0</param>
<param name="maxExclusive">100</param>
</data>
<attribute name="units">
<value type="string">%</value>
</attribute>
</define>
<!-- end of define Age reference -->
<!-- define Amount reference -->
<define name="Amount">
<attribute name="amount">
<data type="string">
<param name="pattern">$\d+(\.\d{1,2})?</param>
</data>
</attribute>
<attribute name="units">
<choice>
<value type="string">million</value>
<value type="string">billion</value>
</choice>
</attribute>
</define>
<!-- end of Amount reference -->
<!-- define Subset reference -->
<define name="Subset">
<interleave>
<text/>
<zeroOrMore>
<ref name="Inline"/>
</zeroOrMore>
<zeroOrMore>
<ref name="Paragraph"/>
</zeroOrMore>
<zeroOrMore>
<ref name="List"/>
</zeroOrMore>
</interleave>
</define>
<!-- end of Subset reference -->
<!-- define Inline reference
choice of either em element or strong element for Inline element
which may contain text and other inline elements
-->
<define name="Inline">
<choice>
<element name="em">
<interleave>
<text/>
<zeroOrMore>
<ref name="Inline"/>
</zeroOrMore>
</interleave>
</element>
<element name="strong">
<interleave>
<text/>
<zeroOrMore>
<ref name="Inline"/>
</zeroOrMore>
</interleave>
</element>
</choice>
</define>
<!-- define p element which may contain text with inline elements
-->
<define name="Paragraph">
<element name="p">
<interleave>
<text/>
<zeroOrMore>
<ref name="Inline"/>
</zeroOrMore>
</interleave>
</element>
</define>
<!-- define List reference => ul element and li element.
The li element may contain text with inline element,
p element and ul element, therefore,
using Subset ref is appropriate
-->
<define name="List">
<element name="ul">
<oneOrMore>
<element name="li">
<ref name="Subset"/>
</element>
</oneOrMore>
</element>
</define>
</grammar>