<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="FlatFile" 
                  targetNamespace="http://www.wayne.com/2007-06-29/FlatFile.xsd"
                  elementFormDefault="qualified"
                  xmlns="http://www.wayne.com/2007-06-29/FlatFile.xsd"
                  xmlns:mstns="http://www.wayne.com/2007-06-29/FlatFile.xsd"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!--.......................... FlatFile ............................................-->
  <xs:element name="FlatFile" >
    <xs:complexType >

      <xs:sequence>
        <xs:element ref="Section" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>

      <xs:attribute name="version" type="xs:string" use="required"/>
      
    </xs:complexType>

  </xs:element>

  <!--........................... Section ............................................-->
  <xs:element name="Section">
    
    <xs:complexType>
      
      <xs:sequence>
        <xs:element name="Definitions" type="DefinitionsType" minOccurs="0"/>
        <xs:element name="Record" type="RecordType" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>

      <xs:attribute name="fieldSeparator" type ="xs:string" use="required"/>
      <xs:attribute name="recordSeparator" type ="xs:string" use="optional"/>      

    </xs:complexType>

    <!--Primary keys -->
    <xs:key name="FormatDefinitionIdKey" >

      <xs:selector xpath="mstns:Definitions/mstns:FormatDefinitions/mstns:Format"/>
      <xs:field xpath="@formatId"/>

    </xs:key>

  </xs:element>

 
  <!-- ............................... Definitions ..................................-->
  <xs:complexType name="DefinitionsType">
    <xs:sequence>
      <xs:element name="FormatDefinitions" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="Format" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:simpleContent >
                  <xs:extension base="xs:string">
                    <xs:attribute name="formatId" type="xs:string" use="required"/>
                  </xs:extension>
                </xs:simpleContent>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <!-- ............................. Record ..........................................-->
  <xs:complexType name="RecordType">
    <xs:sequence >
      
      <!-- Fields-->
      <xs:element name="Field" minOccurs ="0" maxOccurs="unbounded" type ="FieldType">

        <!--Foreign key to the format definitions-->
        <xs:keyref name="FieldDefinedFormat_FormatDefinition" refer="FormatDefinitionIdKey">
          <xs:selector xpath="."/>
          <xs:field xpath="@formatId"/>
        </xs:keyref>

      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="FieldType">
    <xs:simpleContent >
      <xs:extension base="xs:string">
        <xs:attribute name="type" type="fieldDataType" use="required"/>
        <xs:attribute name="format" type="xs:string" />
        <xs:attribute name="formatId" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  
  <!-- Field datatype type.-->
  <xs:simpleType name="fieldDataType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="String"/>
      <xs:enumeration value="Byte"/>
      <xs:enumeration value="Int16"/>
      <xs:enumeration value="Int32"/>
      <xs:enumeration value="Int64"/>
      <xs:enumeration value="UInt16"/>
      <xs:enumeration value="UInt32"/>
      <xs:enumeration value="UInt64"/>
      <xs:enumeration value="Decimal"/>
      <xs:enumeration value="Double"/>
      <xs:enumeration value="DateTime"/>
      <xs:enumeration value="Boolean"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>