<?xml version="1.0" ?>
<!-- 
	Copyright (c) 2001 Jonathan Borden &lt;jonathan@openhealth.org&gt;
	
	A tree regular expression for a simplified RDF syntax
	
	This schema may be freely used as long as this copyright notice is included in this or 
	derivative works and you agree that the author accepts no liability nor responsibility 
	for any use of this document.
-->
<grammar xmlns="http://relaxng.org/ns/structure/0.9"
         ns="http://www.openhealth.org/RDF/RDFSurfaceSyntax#"
		 xmlns:rdf="http://www.openhealth.org/RDF/RDFSurfaceSyntax#"
         datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
 <choice>
   <ref name="bundle"/>
 </choice>
</start>
<define name="bundle">
  <choice>
   <ref name="RDF"/>
   <element name="Bundle">
    <optional>
		<ref name="idAboutAttr"/>
	</optional>
 	<zeroOrMore>
		<ref name="obj"/>
	</zeroOrMore>
   </element>
   <element>
		<not>
		  <choice>
			<nsName/>
			<nsName ns=""/>
		  </choice>
		</not>
 	<zeroOrMore>
		<ref name="obj"/>
	</zeroOrMore>
   </element>
   <ref name="obj"/>
  </choice>	
</define>
<define name="RDF">
 <element name="RDF">
	<zeroOrMore>
		<ref name="obj"/>
	</zeroOrMore>
 </element>
</define>
<define name="obj">
	<choice>
		<ref name="description"/>
		<ref name="container"/>
	</choice>
</define>
<define name="description">
	<choice>
		<element name="Description">
			<optional>
				<ref name="idAboutAttr"/>
			</optional>
			<optional>
				<ref name="bagIdAttr"/>
			</optional>
			<zeroOrMore>
				<ref name="propAttr"/>
			</zeroOrMore>
			<zeroOrMore>
				<ref name="propertyElt"/>
			</zeroOrMore>
		</element>
		<ref name="typedNode"/>
	</choice>
</define>
<define name="container">
	<choice>
		<ref name="sequence"/>
		<ref name="bag"/>
		<ref name="alternative"/>
	</choice>
</define>
<define name="idAboutAttr">
	<choice>
		<ref name="idAttr"/>
		<ref name="aboutAttr"/>
		<ref name="aboutQAttr"/>
	</choice>
</define>
<define name="idAttr">
	<attribute name="rdf:ID">
		<data type="ID"/>
	</attribute>
</define>
<define name="aboutAttr">
	<attribute name="rdf:about">
		<data type="anyURI"/>
	</attribute>
</define>
<define name="aboutQAttr">
	<attribute name="rdf:aboutQ">
		<data type="QName"/>
	</attribute>
</define>
<define name="resourceQAttr">
	<attribute name="rdf:resourceQ">
		<data type="QName"/>
	</attribute>
</define>
<define name="propAttr">
 <choice>
    <ref name="typeAttr"/>
	<attribute>
			<not>
			  <choice>
				<nsName/>
				<nsName ns=""/>
			  </choice>
			</not>
	</attribute>
 </choice>
</define>
<define name="typeAttr">
 <attribute name="rdf:type">
 	<data type="anyURI"/>
 </attribute>
</define>

<define name="propertyElt">
	<choice>
		<element>
			<not>
				<nsName ns=""/>
			</not>
			<optional>
				<ref name="idAttr"/>
			</optional>
			<choice>
				<group>
					<choice>
						<ref name="resourceQAttr"/>
						<ref name="resourceAttr"/>
					</choice>
					<empty/>
				</group>
				<ref name="value"/>
			</choice>
		</element>
		<element>
			<not>
				<nsName ns=""/>
			</not>
			<optional>
				<ref name="idAttr"/>
			</optional>
			<ref name="parseLiteral"/>
			<ref name="literal"/>
		</element>
		<element>
			<not>
				<nsName ns=""/>
			</not>
			<optional>
				<ref name="idAttr"/>
			</optional>
			<ref name="parseResource"/>
			<zeroOrMore>
				<ref name="propertyElt"/>
			</zeroOrMore>
		</element>
		<element>
			<not>
				<nsName ns=""/>
			</not>
			<optional>
				<ref name="idAttr"/>
			</optional>
			<optional>
				<ref name="bagIdAttr"/>
			</optional>
			<ref name="propAttr"/>
			<empty/>
		</element>
	</choice>
</define>
<define name="typedNode">
	<element>
	  <not>
		<nsName ns=""/>
	  </not>
	   <optional>
	     <ref name="idAboutAttr"/>
	   </optional>
	   <optional>
	     <ref name="bagIdAttr"/>
	   </optional>
	  <zeroOrMore>
		<ref name="propAttr"/>
	  </zeroOrMore>
	  <zeroOrMore>
	  	<ref name="propertyElt"/>
	  </zeroOrMore>
	</element>
</define>
<!--<define name="propName">
 <element>
	<not>
		<nsName ns=""/>
	</not>
 </element>
</define>
-->
<define name="idRefAttr">
	<optional>
		<ref name="idAttr"/>
	</optional>
	<choice>
		<ref name="resourceAttr"/>
		<ref name="resourceQAttr"/>
	</choice>
</define>
<define name="value">
	<choice>
		<ref name="obj"/>
		<text/>
	</choice>
</define>
<define name="sequence">
	<element name="Seq">
		<optional>
			<ref name="idAttr"/>
		</optional>
		<zeroOrMore>
				<ref name="memberAttr"/>
		</zeroOrMore>
		<zeroOrMore>
				<ref name="member"/>
		</zeroOrMore>
	</element>
</define>
<define name="bag">
	<element name="Bag">
		<optional>
			<ref name="idAttr"/>
		</optional>
		<zeroOrMore>
				<ref name="memberAttr"/>
		</zeroOrMore>
		<zeroOrMore>
				<ref name="member"/>
		</zeroOrMore>
	</element>
</define>
<!-- check with EBNF here -->
<define name="alternative">
	<element name="Alt">
		<optional>
			<ref name="idAttr"/>
		</optional>
		<zeroOrMore>
				<ref name="memberAttr"/>
		</zeroOrMore>
		<zeroOrMore>
				<ref name="member"/>
		</zeroOrMore>
	</element>
</define>
<define name="member">
	<choice>
		<ref name="referencedItem"/>
		<ref name="inlineItem"/>
	</choice>
</define>
<define name="referencedItem">
	<element name="li">
		<choice>
		 <ref name="resourceAttr"/>
		 <ref name="resourceQAttr"/>
		</choice>
	</element>
</define>
<define name="inlineItem">
	<choice>
	<element name="li">
		<optional>
			<ref name="xmlLangAttr"/>
		</optional>
		<ref name="value"/>
	</element>
	<element name="li">
		<optional>
			<ref name="xmlLangAttr"/>
		</optional>
		<ref name="parseLiteral"/>
		<ref name="literal"/>
	</element>
	<element name="li">
		<ref name="parseResource"/>
		<zeroOrMore>
		<ref name="propertyElt"/>
		</zeroOrMore>
	</element>
	</choice>
</define>
<define name="parseLiteral">
	<attribute name="rdf:parseType">
		<value>Literal</value>
	</attribute>
</define>
<define name="parseExpression">
	<attribute name="rdf:parseType">
		<value>Literal</value>
	</attribute>
</define>
<define name="parseResource">
	<attribute name="rdf:parseType">
		<value>Resource</value>
	</attribute>
</define>
<define name="literal">
 <mixed>
	<zeroOrMore>
		<ref name="any"/>
	</zeroOrMore>
 </mixed>
</define>
<define name="memberAttr">
	<attribute>
		<nsName/>
		<data type="string"/>
	</attribute>
</define>
<define name="bagIdAttr">
	<attribute name="rdf:bagId">
		<data type="ID"/>
	</attribute>
</define>
<define name="resourceAttr">
	<attribute name="rdf:resource">
		<data type="anyURI"/>
	</attribute>
</define>

<define name="any">
    <element>
      <anyName/>
      <zeroOrMore>
        <choice>
	      <attribute>
            <anyName/>
          </attribute>
          <text/>
          <ref name="any"/>
        </choice>
      </zeroOrMore>
    </element>
</define>
<define name="xmlSpaceAttr">
	<attribute name="xml:space">
		<choice>
			<value>preserve</value>
			<value>default</value>
		</choice>
	</attribute>
</define>
<define name="xmlLangAttr">
	<attribute name="xml:lang">
		<data type="NMTOKEN"/>
	</attribute>
</define>
<define name="xmlBaseAttr">
	<attribute name="xml:base">
		<data type="anyURI"/>
	</attribute>
</define>
<define name="xmlAttrs">
	<choice>
		<ref name="xmlSpaceAttr"/>
		<ref name="xmlLangAttr"/>
		<ref name="xmlBaseAttr"/>
	</choice>
</define>

</grammar>