<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified" attributeFormDefault="unqualified">

 <!-- Definition of types -->
 
 <xs:simpleType name="rgbColorValueType">
    <xs:restriction base="xs:integer">
       <xs:minInclusive value="0"/>
       <xs:maxInclusive value="255"/>
    </xs:restriction>
 </xs:simpleType>

<xs:complexType name="rgbColorType">
   <xs:annotation>
     <xs:documentation>
       We could also support a hex color  ...
     </xs:documentation>
   </xs:annotation>
   <xs:attribute name="red" type="rgbColorValueType" use="required"/>
   <xs:attribute name="green" type="rgbColorValueType" use="required"/>
   <xs:attribute name="blue" type="rgbColorValueType" use="required"/>
</xs:complexType>

 <xs:simpleType name="stateEnum">
    <xs:restriction base="xs:string">
       <xs:enumeration value="ON"/>
       <xs:enumeration value="OFF"/>
    </xs:restriction>
 </xs:simpleType>

 <xs:simpleType name="embedStateEnum">
   <xs:restriction base="stateEnum">
     <xs:enumeration value="EMBED"/>
   </xs:restriction>
 </xs:simpleType>

 
 <xs:simpleType name="booleanEnum">
    <xs:restriction base="xs:string">
       <xs:enumeration value="TRUE"/>
       <xs:enumeration value="FALSE"/>
    </xs:restriction>
 </xs:simpleType>

<xs:simpleType name="positionEnum">
  <xs:restriction base="xs:string">
    <xs:enumeration value="ul"/>
    <xs:enumeration value="uc"/>
    <xs:enumeration value="ur"/>
    <xs:enumeration value="ll"/>
    <xs:enumeration value="lc"/>
    <xs:enumeration value="lr"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="fullPositionEnum">
  <xs:restriction base="positionEnum">
    <xs:enumeration value="cl"/>
    <xs:enumeration value="cc"/>
    <xs:enumeration value="cr"/>
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="sizeType">
  <xs:attribute name="x" type="xs:positiveInteger"/>
  <xs:attribute name="y" type="xs:positiveInteger"/>
</xs:complexType>

<xs:complexType name="pointType">
  <xs:attribute name="x" type="xs:float"/>
  <xs:attribute name="y" type="xs:float"/>
</xs:complexType>

<xs:simpleType name="angleType">
  <xs:restriction base="xs:double">
    <xs:minInclusive value="-360"/>
    <xs:maxInclusive value="360"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="attributeType">
  <xs:restriction base="xs:string">
    <xs:pattern value="\[.+\]"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="debugModeEnum">
  <xs:restriction base="xs:string">
    <xs:pattern value="[oO][nN]|[oO][fF][fF]|1|2|3|4|5"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="unitType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="FEET"/>
    <xs:enumeration value="INCHES"/>
    <xs:enumeration value="KILOMETERS"/>
    <xs:enumeration value="METERS"/>
    <xs:enumeration value="MILES"/>
  </xs:restriction>
</xs:simpleType>

<xs:simpleType name="extendedUnitType">
  <xs:restriction base="unitType">
    <xs:enumeration value="PIXELS"/>
    <xs:enumeration value="DD"/>
  </xs:restriction>
</xs:simpleType>

 <xs:complexType name="itemType">
   <xs:sequence>
      <xs:element name="item" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string">
              <xs:attribute name="name" type="xs:string" use="required"/>
            </xs:extension>
         </xs:simpleContent>
        </xs:complexType>
      </xs:element>
   </xs:sequence>
 </xs:complexType>

 <xs:simpleType name="alignEnum">
   <xs:restriction base="xs:string">
     <xs:enumeration value="left"/>
     <xs:enumeration value="center"/>
     <xs:enumeration value="right"/>
   </xs:restriction>
 </xs:simpleType>
 
<!-- Definition of Mapfile elements -->

<!-- QUERYMAP Definition -->
<xs:element name="QueryMap">
   <xs:complexType>
     <xs:all>
        <xs:element name="style" minOccurs="0">
           <xs:simpleType>
              <xs:restriction base="xs:string">
                 <xs:enumeration value="NORMAL"/>
                 <xs:enumeration value="HILITE"/>
                 <xs:enumeration value="SELECTED"/>
              </xs:restriction>
           </xs:simpleType>
        </xs:element>
        <xs:element name="color" type="rgbColorType" minOccurs="0"/>
        <xs:element name="size" type="sizeType" minOccurs="0"/>
     </xs:all>
      <xs:attribute name="status" type="stateEnum"/>
   </xs:complexType>
</xs:element>

<!-- WEB Definition -->
<xs:element name="Web">
   <xs:complexType>
      <xs:all>
         <xs:element name="empty" type="xs:string" minOccurs="0"/>
         <xs:element name="error" type="xs:string" minOccurs="0"/>
         <xs:element name="footer" type="xs:string" minOccurs="0"/>
         <xs:element name="header" type="xs:string" minOccurs="0"/>
         <xs:element name="imagePath" type="xs:string" minOccurs="0"/>
         <xs:element name="imageUrl" type="xs:string" minOccurs="0"/>
         <xs:element name="log" type="xs:string" minOccurs="0"/>
         <xs:element name="maxScaleDenom" type="xs:double" minOccurs="0"/>
         <xs:element name="maxTemplate" type="xs:string" minOccurs="0"/>
         <xs:element name="Metadata" type="itemType" minOccurs="0"/>
         <xs:element name="minScaleDenom" type="xs:double" minOccurs="0"/>
         <xs:element name="minTemplate" type="xs:string" minOccurs="0"/>
         <xs:element name="outputFormat" type="xs:string" minOccurs="0"/>
         <xs:element name="template" type="xs:string" minOccurs="0"/>
      </xs:all>
   </xs:complexType>
</xs:element>

<xs:element name="OutputFormat">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="driver" type="xs:string" minOccurs="0"/>
      <xs:element name="extension" type="xs:string" minOccurs="0"/>
      <xs:element name="formatOption" type="xs:string"  minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="imageMode">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="PC256"/>
            <xs:enumeration value="RGB"/>
            <xs:enumeration value="RGBA"/>
            <xs:enumeration value="BYTE"/>
            <xs:enumeration value="INT16"/>
            <xs:enumeration value="FLOAT32"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="mimeType" type="xs:string" minOccurs="0"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="transparent" type="stateEnum" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<!-- LEGEND Definition -->
 <xs:element name="Legend">
   <xs:complexType>
     <xs:all>
       <xs:element name="imageColor" type="rgbColorType" minOccurs="0"/>
       <xs:element ref="Label" minOccurs="0"/>
       <xs:element name="outlineColor" type="rgbColorType" minOccurs="0"/>
       <xs:element name="position" type="positionEnum" minOccurs="0"/>
       <xs:element name="keySize" type="sizeType" minOccurs="0"/>
       <xs:element name="keySpacing" type="sizeType" minOccurs="0"/>
       <xs:element name="postLabelCache" type="booleanEnum" minOccurs="0"/>
       <xs:element name="status" type="embedStateEnum"/>
       <xs:element name="template" type="xs:string" minOccurs="0"/>
     </xs:all>
   </xs:complexType>
 </xs:element>
 
 <!-- SCALEBAR Definition -->
 <xs:element name="ScaleBar">
   <xs:complexType>
     <xs:sequence>
       <xs:element name="align" type="alignEnum"/>
       <xs:element name="backgroundColor" type="rgbColorType" minOccurs="0"/>
       <xs:element name="color" type="rgbColorType" minOccurs="0"/>
       <xs:element name="imageColor" type="rgbColorType" minOccurs="0"/>
       <xs:element name="intervals" type="xs:positiveInteger" default="4" minOccurs="0"/>
       <xs:element ref="Label" minOccurs="0"/>
       <xs:element name="outlineColor" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="-1"/>
              <xs:maxInclusive value="255"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="position" type="positionEnum" default="lr" minOccurs="0"/>
        <xs:element name="postLabelCache" type="booleanEnum" default="FALSE" minOccurs="0"/>
        <xs:element name="size" type="sizeType" minOccurs="0"/>
        <xs:element name="status" type="embedStateEnum" default="OFF" minOccurs="0"/>
        <xs:element name="style" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:positiveInteger">
              <xs:minInclusive value="0"/>
              <xs:maxInclusive value="1"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="units" type="unitType" default="MILES" minOccurs="0"/>
     </xs:sequence>
   </xs:complexType>
 </xs:element>
 
<!-- LABEL Definition -->
<xs:element name="Label">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="angle" minOccurs="0">
        <xs:simpleType name="labelAngleType">
          <xs:union memberTypes="angleType attributeType">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:pattern value="[aA][uU][tT][oO]|[fF][oO][lL][lL][oO][wW]"/>  <!-- attribute -->
              </xs:restriction>
            </xs:simpleType>
          </xs:union>
         </xs:simpleType>
      </xs:element>
    <xs:element name="antialias" type="booleanEnum" minOccurs="0"/>
    <xs:element name="backgroundColor" type="rgbColorType" minOccurs="0"/>
    <xs:element name="backgroundShadowColor" type="rgbColorType" minOccurs="0"/>
    <xs:element name="backgroundShadowSize" type="sizeType" minOccurs="0"/>
    <xs:element name="buffer" type="xs:integer" minOccurs="0"/>
    <xs:choice minOccurs="0">
      <xs:element name="color" type="rgbColorType"/>
      <xs:element name="colorAttribute" type="attributeType"/>
    </xs:choice>
    <xs:element name="encoding" minOccurs="0"/>
    <xs:element name="font" type="xs:string" minOccurs="0"/>
    <xs:element name="force" type="booleanEnum" default="false" minOccurs="0"/>
    <xs:element name="maxSize" type="xs:integer" default="256" minOccurs="0"/>
    <xs:element name="minDistance" type="xs:integer" minOccurs="0"/>
    <xs:element name="minFeatureSize" minOccurs="0">
      <xs:simpleType>
        <xs:union memberTypes="xs:integer">
          <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="auto"/>
          </xs:restriction>
          </xs:simpleType>
        </xs:union>
      </xs:simpleType>
    </xs:element>
    <xs:element name="minSize" type="xs:integer" default="4" minOccurs="0"/>
    <xs:element name="offset" type="sizeType" minOccurs="0"/>
    <xs:choice minOccurs="0">
       <xs:element name="outlineColor" type="rgbColorType"/>
       <xs:element name="outlineColorAttribute" type="attributeType"/>
    </xs:choice>
    <xs:element name="partials" type="booleanEnum" minOccurs="0"/>
    <xs:element name="position" minOccurs="0">
      <xs:simpleType>
        <xs:union memberTypes="fullPositionEnum">
         <xs:simpleType>
           <xs:restriction base="xs:string">
             <xs:enumeration value="AUTO"/>
           </xs:restriction>
         </xs:simpleType>
        </xs:union>
      </xs:simpleType>
    </xs:element>
    <xs:element name="priority" default="1" minOccurs="0">
      <xs:simpleType>
        <xs:union memberTypes="attributeType">
          <xs:simpleType>
          <xs:restriction base="xs:integer">
            <xs:minInclusive value="1"/>
            <xs:maxInclusive value="10"/>
          </xs:restriction>
          </xs:simpleType>
        </xs:union>
      </xs:simpleType>
    </xs:element>
    <xs:element name="shadowColor" type="rgbColorType" minOccurs="0"/>
    <xs:element name="shadowSize" type="sizeType" minOccurs="0"/>
    <xs:element name="size">
      <xs:simpleType>
        <xs:union memberTypes="attributeType xs:positiveInteger">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="tiny"/>
              <xs:enumeration value="small"/>
              <xs:enumeration value="medium"/>
              <xs:enumeration value="large"/>
              <xs:enumeration value="giant"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:union>
      </xs:simpleType>
    </xs:element>
     <xs:element name="type">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="BITMAP"/>
          <xs:enumeration value="TRUETYPE"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    <xs:element name="wrap" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<!-- STYLE Definition -->
<xs:element name="Style">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="angle" default="0" minOccurs="0">
        <xs:simpleType>
          <xs:union memberTypes="xs:double attributeType"/>
        </xs:simpleType>
      </xs:element>
      <xs:element name="antialias" type="booleanEnum"/>
      <xs:element name="backgroundColor" type="rgbColorType" minOccurs="0"/>
      <xs:choice minOccurs="0">
        <xs:element name="color" type="rgbColorType"/>
        <xs:element name="colorAttribute" type="attributeType"/>
      </xs:choice>
    <xs:element name="maxSize" type="xs:integer" default="50" minOccurs="0"/>
    <xs:element name="minSize" type="xs:integer" default="0" minOccurs="0"/>
    <xs:element name="minWidth" type="xs:integer" minOccurs="0"/>
    <xs:element name="offset" type="sizeType" minOccurs="0"/>
    <xs:choice minOccurs="0">
      <xs:element name="outlineColor" type="rgbColorType"/>
      <xs:element name="outlineColorAttribute" type="attributeType"/>
    </xs:choice>
    <xs:element name="size" default="1" minOccurs="0">
      <xs:simpleType>
        <xs:union memberTypes="xs:positiveInteger attributeType"/>
      </xs:simpleType>
    </xs:element>
    <xs:element name="symbol" default="0" minOccurs="0">
      <xs:simpleType>
        <xs:union memberTypes="xs:positiveInteger xs:string"/>
      </xs:simpleType>
    </xs:element>
    <xs:element name="width" type="xs:positiveInteger" default="1" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<!--  CLASS Definition -->
<xs:element name="Class">
  <xs:complexType>
    <xs:sequence>
     <xs:element name="Metadata" type="itemType" minOccurs="0"/>
      <xs:element name="backgroundColor" type="rgbColorType" minOccurs="0"/>
      <xs:element name="color" type="rgbColorType" minOccurs="0"/>
      <xs:element name="debug" type="stateEnum" minOccurs="0"/>
      <xs:element name="expression" type="xs:string" minOccurs="0"/>
      <xs:element name="group" type="xs:string" minOccurs="0"/>
      <xs:element name="keyImage" type="xs:string" minOccurs="0"/>
      <xs:element ref="Label" minOccurs="0"/>
      <xs:element name="maxScaleDenom" type="xs:double" minOccurs="0"/>
      <xs:element name="maxSize" type="xs:positiveInteger" default="50" minOccurs="0"/>
      <xs:element name="minScaleDenom" type="xs:double" minOccurs="0"/>
      <xs:element name="minSize" type="xs:positiveInteger" default="0" minOccurs="0"/>
      <xs:element name="name" type="xs:string"/>
      <xs:choice>
        <xs:element name="outlineColor" type="rgbColorType"/>
        <xs:element name="outlineColorAttribute" type="attributeType"/>
      </xs:choice>
    <xs:element name="size" type="xs:positiveInteger" default="1" minOccurs="0"/>
    <xs:element ref="Style" minOccurs="0" maxOccurs="unbounded"/>
    <xs:element name="status" type="stateEnum" default="ON" minOccurs="0"/>
    <xs:element name="symbol" default="0" minOccurs="0">
      <xs:simpleType>
        <xs:union memberTypes="xs:positiveInteger xs:string"/>
      </xs:simpleType>
    </xs:element>
    <xs:element name="template" type="xs:string" minOccurs="0"/>
    <xs:element name="text" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<!-- SYMBOL Definition -->
<xs:element name="Symbol">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="antialias" type="booleanEnum" minOccurs="0"/>
      <xs:element name="character" type="xs:string" minOccurs="0"/>
      <xs:element name="filled" type="booleanEnum" minOccurs="0"/>
      <xs:element name="font" type="xs:string" minOccurs="0"/>
      <xs:element name="gap" type="xs:integer" default="0" minOccurs="0"/>
      <xs:element name="image" type="xs:string" minOccurs="0"/>
      <xs:element name="lineCap" default="butt" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="butt"/>
            <xs:enumeration value="round"/>
            <xs:enumeration value="square"/>
            <xs:enumeration value="triangle"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="lineJoin" default="butt" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="round"/>
            <xs:enumeration value="miter"/>
            <xs:enumeration value="bevel"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="lineJoinMaxSize" type="xs:integer" default="3" minOccurs="0"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="Points" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="point" type="pointType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="transparent" type="xs:positiveInteger" minOccurs="0"/>
      <xs:element name="type">
        <xs:simpleType>
          <xs:restriction base="xs:string">
              <xs:enumeration value="vector"/>
              <xs:enumeration value="ellipse"/>
              <xs:enumeration value="pixmap"/>
              <xs:enumeration value="truetype"/>
              <xs:enumeration value="cartoline"/>
              <xs:enumeration value="hatch"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
      </xs:sequence>
  </xs:complexType>
</xs:element>

<!-- FEATURE Definition -->
<xs:element name="Feature">
<xs:complexType>
  <xs:all>
    <xs:element name="Points" minOccurs="0">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="point" type="pointType" minOccurs="0" maxOccurs="unbounded"/>
         </xs:sequence>
      </xs:complexType>
    </xs:element>
    <xs:element name="text" type="xs:string" minOccurs="0"/>
    <xs:element name="wkt" type="xs:string" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
</xs:element>

<!-- GIRD Definition -->
<xs:element name="Grid">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="labelFormat" type="xs:string" minOccurs="0"/>
      <xs:element name="minArcs" type="xs:double" minOccurs="0"/>
      <xs:element name="maxArcs" type="xs:double" minOccurs="0"/>
      <xs:element name="minInterval" type="xs:double" minOccurs="0"/>
      <xs:element name="maxInterval" type="xs:double" minOccurs="0"/>
      <xs:element name="minSubdivide" type="xs:double" minOccurs="0"/>
      <xs:element name="maxSubdivide" type="xs:double" default="256" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<xs:element name="Join">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="connection" type="xs:string" minOccurs="0"/>
      <xs:element name="connectionType" default="local" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
              <xs:enumeration value="local"/>
            <xs:enumeration value="sde"/>
            <xs:enumeration value="ogr"/>
            <xs:enumeration value="postgis"/>
            <xs:enumeration value="oraclespatial"/>
            <xs:enumeration value="wms"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="from" type="xs:string"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="table" type="xs:string"/>
      <xs:element name="template" type="xs:string" minOccurs="0"/>
      <xs:element name="to" type="xs:string"/>
      <xs:element name="type" default="ONE-TO-ONE" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:enumeration value="ONE-TO-ONE"/>
            <xs:enumeration value="ONE-TO-MANY"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

 <!-- REFERENCE Definition -->
<xs:element name="Reference">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="color" type="rgbColorType" minOccurs="0"/>
        <xs:element name="extent" minOccurs="0">
          <xs:simpleType>
            <xs:list itemType="xs:double"/>
          </xs:simpleType>
        </xs:element>
        <xs:element name="image" type="xs:string" minOccurs="0"/>
        <xs:element name="marker" minOccurs="0">
          <xs:simpleType>
           <xs:union memberTypes="xs:positiveInteger xs:string"/>
          </xs:simpleType>
        </xs:element>
        <xs:element name="markerSize" type="xs:positiveInteger" minOccurs="0"/>
        <xs:element name="minBoxSize" type="xs:positiveInteger" minOccurs="0"/>
        <xs:element name="maxBoxSize" type="xs:positiveInteger" minOccurs="0"/>
        <xs:element name="outlineColor" minOccurs="0">
          <xs:simpleType>
            <xs:restriction base="xs:integer">
              <xs:minInclusive value="-1"/>
              <xs:maxInclusive value="255"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="size" type="sizeType" minOccurs="0"/>
        <xs:element name="status" type="stateEnum" default="OFF" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<!-- LAYER Definition -->
<xs:element name="Layer">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Class" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="classItem" type="xs:string" minOccurs="0"/>
      <xs:element name="classGroup" type="xs:string" minOccurs="0"/>
      <xs:element name="connection" type="xs:string" minOccurs="0"/>
      <xs:element name="connectionType" default="local" minOccurs="0">
        <xs:simpleType>
          <xs:restriction base="xs:string">
              <xs:enumeration value="local"/>
            <xs:enumeration value="sde"/>
            <xs:enumeration value="ogr"/>
            <xs:enumeration value="postgis"/>
            <xs:enumeration value="oraclespatial"/>
            <xs:enumeration value="wms"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="data" type="xs:string" minOccurs="0"/>
      <xs:element name="debug" type="debugModeEnum" default="OFF" minOccurs="0"/>
      <xs:element name="dump" type="booleanEnum" default="FALSE" minOccurs="0"/>
      <xs:element ref="Feature" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="filter" type="xs:string" minOccurs="0"/>
      <xs:element name="filterItem" type="xs:string" minOccurs="0"/>
      <xs:element name="footer" type="xs:string" minOccurs="0"/>
      <xs:element ref="Grid" minOccurs="0"/>
      <xs:element name="group" type="xs:string" minOccurs="0"/>
      <xs:element name="header" type="xs:string" minOccurs="0"/>
      <xs:element ref="Join" minOccurs="0"/>
      <xs:element name="labelCache" type="stateEnum" default="ON" minOccurs="0"/>
      <xs:element name="labelItem" type="xs:string" minOccurs="0"/>
      <xs:element name="labelMaxScaleDenom" type="xs:double" minOccurs="0"/>
      <xs:element name="labelMinScaleDenom" type="xs:double" minOccurs="0"/>
      <xs:element name="labelRequires" type="xs:string" minOccurs="0"/>
      <xs:element name="maxFeatures" type="xs:positiveInteger" minOccurs="0"/>
      <xs:element name="maxScaleDenom" type="xs:double" minOccurs="0"/>
      <xs:element name="Metadata" type="itemType" minOccurs="0"/>
      <xs:element name="minScaleDenom" type="xs:double" minOccurs="0"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="offsite" type="rgbColorType" minOccurs="0"/>
      <xs:element name="opacity" minOccurs="0">
        <xs:simpleType>
          <xs:union>
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="ALPHA"/>
              </xs:restriction>
            </xs:simpleType>
            <xs:simpleType>
              <xs:restriction base="xs:positiveInteger">
                <xs:minInclusive value="0"/>
                <xs:maxInclusive value="100"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:union>
        </xs:simpleType>
      </xs:element>
      <xs:element name="postLabelCache" type="booleanEnum" default="FALSE" minOccurs="0"/>
      <xs:element name="processing" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="projection" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element name="requires" type="xs:string" minOccurs="0"/>
      <xs:element name="sizeUnits" type="extendedUnitType" default="PIXELS" minOccurs="0"/>
      <xs:element name="status" default="ON" minOccurs="0">
         <xs:simpleType>
          <xs:union memberTypes="stateEnum">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="DEFAULT"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:union>
        </xs:simpleType>
      </xs:element>
      <xs:element name="styleItem" type="xs:string" minOccurs="0"/>
      <xs:element name="symbolsScaleDenom" type="xs:double" minOccurs="0"/>
      <xs:element name="template" type="xs:string" minOccurs="0"/>
      <xs:element name="tileIndex" type="xs:string" minOccurs="0"/>
      <xs:element name="tileItem" type="xs:string" default="location" minOccurs="0"/>
      <xs:element name="tolerance" type="xs:double" minOccurs="0"/>
      <xs:element name="toleranceUnits" type="extendedUnitType" default="PIXELS" minOccurs="0"/>
      <xs:element name="transform" default="TRUE" minOccurs="0">
        <xs:simpleType>
          <xs:union memberTypes="booleanEnum fullPositionEnum"/>
        </xs:simpleType>
      </xs:element>
      <xs:element name="type">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="POINT"/>
          <xs:enumeration value="LINE"/>
          <xs:enumeration value="POLYGON"/>
          <xs:enumeration value="CIRCLE"/>
          <xs:enumeration value="ANNOTATION"/>
          <xs:enumeration value="RASTER"/>
          <xs:enumeration value="QUERY"/>
          <xs:enumeration value="CHART"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
      <xs:element name="units" minOccurs="0">
        <xs:simpleType>
          <xs:union memberTypes="extendedUnitType">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="percentages"/>
              </xs:restriction>
            </xs:simpleType>
          </xs:union>
        </xs:simpleType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

<!-- MAP Definition -->
<xs:element name="Map">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="angle" type="xs:double" default="0" minOccurs="0"/>
      <xs:element name="Config" type="itemType" minOccurs="0"/>
      <xs:element name="dataPattern" type="xs:string" minOccurs="0"/>
      <xs:element name="debug" type="debugModeEnum" default="OFF" minOccurs="0"/>
      <xs:element name="extent" minOccurs="0">
        <xs:simpleType>
          <xs:list itemType="xs:double"/>
        </xs:simpleType>
      </xs:element>
      <xs:element name="fontSet" type="xs:string" minOccurs="0"/>
      <xs:element name="imageColor" type="rgbColorType" minOccurs="0"/>
      <xs:element name="imageType" type="xs:string" minOccurs="0"/>
      <xs:element ref="Layer" minOccurs="1" maxOccurs="unbounded"/>
      <xs:element ref="Legend" minOccurs="0" maxOccurs="1"/>
      <xs:element name="maxSize" type="xs:positiveInteger" minOccurs="0"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="projection" type="xs:string" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="QueryMap" minOccurs="0" maxOccurs="1"/>
      <xs:element ref="Reference" minOccurs="0"/>
      <xs:element name="resolution" type="xs:positiveInteger" default="72" minOccurs="0"/>
      <xs:element name="scaleDenom" type="xs:double" minOccurs="0"/>
      <xs:element ref="ScaleBar"/>
      <xs:element name="shapePath" type="xs:string" minOccurs="0"/>
      <xs:element name="size" type="sizeType" minOccurs="0"/>
      <xs:element name="status" type="stateEnum" default="ON" minOccurs="0"/>
      <xs:element name="symbolSet" type="xs:string" minOccurs="0"/>
      <xs:element ref="Symbol" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="templatePattern" type="xs:string" minOccurs="0"/>
      <xs:element name="units" type="extendedUnitType" minOccurs="0"/>
      <xs:element ref="Web" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

