<?xml version='1.0'?>

<!-- Version number of this CaveSurvey Schema -->
version "0.12"

<!-- XSD for the CaveScript CaveSurvey XML -->
<!-- by: Martin Laverty, martinl@talk21.com -->
<!-- after DTD by: Michael Lake, Mike.Lake@uts.edu.au -->

<!-- notation name="svx" system="survex.exe" /-->

<schema xmlns='http://www.w3.org/1999/XMLSchema'>

<!-- ============ Root Element Name and Content ============ -->
<element name="caveSurvey" type="caveSurvey" >

<annotation>
 <appinfo></appinfo>
 <documentation><h1>CaveScript</h1></documentation>
</annotation>

<complexType name="caveSurvey">
  <element name="head" type="head" maxOccurs="1" />
  <element name="surveyors" minOccurs="0" maxOccurs="unlimited" />
  <element name="instruments" minOccurs="0" maxOccurs="unlimited" />
  <element name="surveySeries" maxOccurs="unlimited" />
  <element ref="comment" type="string" maxOccurs="0" maxOccurs="unlimited" />
</complexType> 

<simpleType name="comment"></simpleType>

<!-- ============ Area Cave and Date Information ============ -->

<complexType name="head" >
  <element name="area"  type="area"  maxOccurs="1" />  
  <element name="cave"  type="cave"  maxOccurs="1" />  
  <element name="dates" type="dates" minOccurs="0" maxOccurs="1" /> 
</complexType> 

<complexType name="area" >
  <attribute name="name"        use="required" />   
  <attribute name="declination" type="double" />
</complexType>

<complexType name="cave" >
  <attribute name="name" minOccurs="0" /> 
  <attribute name="tag"  use="required"  /> 
</complexType>

<!-- change date to dates and add attribute type? -->
<complexType name="dates" >
  <element name="surveyDate"       type="date" minOccurs="0" maxOccurs="1" />  
  <element name="creationDate"     type="date" minOccurs="0" maxOccurs="1" />  
  <element name="modificationDate" type="date" minOccurs="0" maxOccurs="1" />  
  <element name="lastAccessDate"   type="date" minOccurs="0" maxOccurs="1" />  
</complexType>

<!-- ============ The Cave Surveyors ============ -->

<complexType name="surveyors" base="surveyor" derivedBy="extension" >
  <element name="surveyor" type="surveyor" minOccurs="1" maxOccurs="unlimited" />
</complexType>

<complexType name="surveyor" >   
  <attribute name="name" use="required" />
  <attribute name="name_link" type="uri"   />  
  <attribute name="affiliation" />  
  <attribute name="affiliation_link" type="uri"  />  
</complexType>

<!-- ============ The Instruments Used ============ -->

<complexType name="instruments" >
  <element name="instrument" type="instrument" abstract="true" 
           minOccurs="0" maxOccurs="unlimited" />
</complexType>

<complexType name="instrument" > 
  <attribute name="instrument_id" type="" use="required" />
  <attribute name="used"          type="" use="required" />
  <attribute name="zero_correct"  type="" use="default"  value="0.0" />
  <attribute name="scale_correct" type="" use="default"  value="1.0" />
  <attribute name="accuracy"      type="" />
</complexType>

<element name="tape" equivClass="instrument" >
  <attribute name="units"  type="" use="default" value="metres">
   <enumeration value="metres" />
   <enumeration value="feet" />
   <enumeration value="yards" />
  </attribute>
 </element>

 <element name="compass" equivClass="instrument" >
  <attribute name="units" type="" use="default" value="degrees" >
   <enumeration value="deg" />
   <enumeration value="degrees" />
   <enumeration value="grads" />
   <enumeration value="mils" />
   <enumeration value="minutes" />
  </attribute>
 </element>

 <element name="clinometer" equivClass="instrument" > 
  <attribute name="units" type="" use="default" value="degrees" >
   <enumeration value="deg" />
   <enumeration value="degrees" />
   <enumeration value="grads" />
   <enumeration value="mils" />
   <enumeration value="percent" />
  </attribute >
 </element>

 <element name="theodolite" equivClass="instrument" >
  <attribute name="units" type="" use="default" value="degrees" >
   <enumeration value="deg" />
   <enumeration value="degrees" />
   <enumeration value="grads" />
   <enumeration value="mils" />
   <enumeration value="minutes" />
   <enumeration value="seconds" />
  </attribute>
 </element>

 <element name="topofil" equivClass="instrument" >
  <attribute name="units"  type="" use="default" value="metres" >
   <enumeration value="metres" />
   <enumeration value="feet" />
   <enumeration value="yards" />
  </attribute>
 </element>

 <!-- Depth Gauges are used in cave diving surveys -->
 <element name="depthGauge" equivClass="instrument" > 
  <attribute name="units" use="default" value="metres" >
   <enumeration value="metres" />
   <enumeration value="feet" />
   <enumeration value="yards" />
  </attribute>
 </element>

<!-- ============ The Survey Data ============ -->
<complexType name="surveySeries" >
  <sequence>
    <sequence>
      <element name="surveyors" type="surveyors" minOccurs="0" 
	           maxOccurs="unlimited" /> 
	  <element name="instruments" type="instruments" minOccurs="0" 
               maxOccurs="unlimited" />
      <element name="status" type="status" minOccurs="0" 
	           maxOccurs="unlimited" />
    </sequence>

    <sequence>
      <element name="station" type="station" maxOccurs="unlimited" />
      <element name="leg" type="leg" maxOccurs="unlimited" />
    </sequence>

  <element name="x_sect" type="x_sect" minOccurs="0" maxOccurs="unlimited" />
  <element name="surveySeries" type="surveySeries" minOccurs="0" 
           maxOccurs="unlimited" />
  </sequence>

  <attribute name="description" />
  <attribute name="date" type="date" minOccurs="0" />
  <attribute name="declination" type="double" minOccurs="0" />
</complexType>

<simpleType name="status" >
  <enumeration value="raw data" />
  <enumeration value="calibrated data" />
  <enumeration value="fixed data" />
  <enumeration value="preliminary" />
  <enumeration value="fully processed" />
</simpleType> 

<complexType name="station" >
  <element name="name" type="string" maxOccurs="1" />
  <element name="east" type="double" maxOccurs="1" />
  <element name="north" type="double" maxOccurs="1" />
  <element name="vertical" type="double" maxOccurs="1" />
  <!-- altitude, depth, rel, abs -->
  <element name="error_east" type="double" minOccurs="0" maxOccurs="1" />
  <element name="error_north" type="double" minOccurs="0" maxOccurs="1" />
  <element name="error_vertical" type="double" minOccurs="0" maxOccurs="1" />
</complexType>

<complexType name="grade" >
  <attribute name="type" >
    <enumeration value="ASF" />
    <enumeration value="BCRA" />
    <enumeration value="CRG" />
  </attribute>
  <attribute name="level_line" >
    <enumeration value="2" />
    <enumeration value="4" />
    <enumeration value="5" />
  </attribute>
  <attribute name="level_detail" >
    <enumeration value="a" />
    <enumeration value="b" />
    <enumeration value="c" />
    <enumeration value="d" />
  </attribute>
</complexType>

<element name="leg" type="leg"  />

<complexType name="leg"  abstract="true" >
  <attribute name="from" type="station.name" use="required" />
  <attribute name="to"   type="station.name" use="required" />
  <attribute name="dist" type="double"       use="required" minInclusive="0"/>
  <attribute name="azim" type="double"       use="required" minInclusive="0" 
             maxInclusive="360" />
  <attribute name="error_dist" type="double" minInclusive="0" />
  <attribute name="error_azim" type="double" minInclusive="0" />
  <choice >
    <element name="standardLeg" />   
    <element name="divingLeg" />   
  </choice>
</complexType>
  
<element name="standardLeg" equivClass="leg"  >
  <attribute name="incl" type="double" use="required" minInclusive="-90" 
             maxInclusive="90" />
  <attribute name="error_i" type="double" minInclusive="0" />
</element>
  
<element name="divingLeg" equivClass="leg"  >
  <attribute name="fromDepth"  type="double" use="required" />
  <attribute name="toDepth"  type="double" use="required" />
  <attribute name="error_v" type="double" minInclusive="0" />
</element>
 
<element name="x_sect" type="x_sect" />

<complexType name="x_sect" >
  <element name="points" maxOccurs="unlimited" />
</complexType>

<complexType name="points" >
  <attribute name="leg" type="leg" use="required" />
  <attribute name="position" type="double"  />
  <attribute name="strike" type="double"  minInclusive="0" maxInclusive="360" />
  <attribute name="dip" type="double" minInclusive="-90" maxInclusive="90" />
</complexType>
 
<element name="equate" type="equate" />

<complexType name="equate" >
  <attribute name="equate" type="xml:link" use="required" />
</complexType>

</schema>


