<?xml version="1.0" ?>
<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">
	<zeroOrMore>
		<ref name="any"/>
	</zeroOrMore>
</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>