<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:annotation>
        <xs:appinfo>SeqXML Schema</xs:appinfo>
        <xs:documentation>
    This Schema defines the SeqXML version 0.4. Author(s): Sanjit Roopra, Fabian Schreiber, Dave Messina, Thomas Schmitt and Erik Sonnhammer. 
    SBC - Stockholm Bioinformatics Centre. 2009-2011. More info at http://seqxml.org
    </xs:documentation>
    </xs:annotation>
    <xs:element name="seqXML">
        <xs:annotation>
            <xs:documentation>Entry point for SeqXML. Multiple sequence records (entries) possible</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="1" maxOccurs="unbounded" name="entry" type="entryType"/>
            </xs:sequence>
            <xs:attribute name="source" use="optional" type="xs:string"/>
            <xs:attribute name="sourceVersion" use="optional"/>
            <xs:attribute name="seqXMLversion" use="required" type="xs:decimal"/>
            <xs:attribute name="ncbiTaxID" use="optional" type="xs:integer">
	            <xs:annotation>
	            	<xs:documentation>Global definition of the species for all entry in the file.</xs:documentation>
	        	</xs:annotation>
            </xs:attribute>
            <xs:attribute name="speciesName" use="optional" type="xs:string">
            	 <xs:annotation>
	            	<xs:documentation>Global definition of the species for all entry in the file.</xs:documentation>
	        	</xs:annotation>
	        </xs:attribute>
        </xs:complexType>
        <xs:unique name="uniqueEntryId">
            <xs:selector xpath=".//entry"/>
            <xs:field xpath="@id"/>
        </xs:unique>
    </xs:element>
    <!--...............................................................................................-->
    <xs:complexType name="entryType">
        <xs:annotation>
            <xs:documentation>Entry type used for all sequence entries.</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element minOccurs="0" maxOccurs="1" name="species" type="species">
            	<xs:annotation>
	            	<xs:documentation>Local definition of the species as alternative to global definition in the document root.</xs:documentation>
	        	</xs:annotation>
            </xs:element>
            <xs:element minOccurs="0" maxOccurs="1" name="description"  type="xs:string"/>
            <xs:choice>
                <xs:element name="DNAseq" type="dnaSeq"/>
                <xs:element name="RNAseq" type="rnaSeq"/>
                <xs:element name="AAseq" type="aaSeq"/>
            </xs:choice>
            <xs:element minOccurs="0" maxOccurs="unbounded" name="DBRef" type="DBRef"/>
            <xs:element minOccurs="0" maxOccurs="unbounded" name="property" type="property"/>
        </xs:sequence>
        <xs:attribute name="id" use="required" type="xs:string"/>
        <xs:attribute name="source" use="optional" type="xs:string"/>
    </xs:complexType>
    <!--...............................................................................................-->
    <xs:complexType name="species">
    	<xs:annotation>
			<xs:documentation>Species definition.</xs:documentation>
		</xs:annotation>
        <xs:attribute name="ncbiTaxID" use="required" type="xs:integer"/>
	    <xs:attribute name="name" use="required"/>
    </xs:complexType>
    <!--...............................................................................................-->
    <xs:complexType name="DBRef">
    	<xs:annotation>
			<xs:documentation>Cross reference to other data bases.</xs:documentation>
		</xs:annotation>
    	<xs:attribute name="type" use="optional" type="seqType">
    		<xs:annotation>
				<xs:documentation>The type of data that the DBRef refers to. Common types would be, for example: DNA, RNA, AA, ncRNA, structure, SNP, journal article.</xs:documentation>
			</xs:annotation>
    	</xs:attribute>
        <xs:attribute name="source" use="required" type="xs:string">
	        <xs:annotation>
				<xs:documentation>The name of the source (usually a database) that the DBRef comes from.</xs:documentation>
			</xs:annotation>
        </xs:attribute>
        <xs:attribute name="id" use="required" type="xs:string">
        	<xs:annotation>
				<xs:documentation>The alternative identifier.</xs:documentation>
			</xs:annotation>
        </xs:attribute>
    </xs:complexType>
    <!--...............................................................................................-->
	<xs:complexType name="property">
		<xs:annotation>
			<xs:documentation>Key-value pair for annotating the sequence. Put
				alternative IDs in DBRef element</xs:documentation>
		</xs:annotation>
		<xs:attribute name="name" use="required" type="xs:string" />
		<xs:attribute name="value" />
	</xs:complexType>
    <!--...............................................................................................-->
    <xs:simpleType name="seqType">
    	<xs:restriction base="xs:string">
    		<xs:minLength value="1" />
    	</xs:restriction>
    </xs:simpleType>
    <!--...............................................................................................-->
    <xs:simpleType name="dnaSeq">
        <xs:annotation>
            <xs:documentation>Type used for DNA sequence</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[A|C|G|T|M|R|W|S|Y|K|V|H|D|B|X|N|\.|\-]+"/>
            <xs:minLength value="1" />
        </xs:restriction>
    </xs:simpleType>
    <!--...............................................................................................-->
    <xs:simpleType name="rnaSeq">
        <xs:annotation>
            <xs:documentation>Type used for RNA sequence</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[A|C|G|U|M|R|W|S|Y|K|V|H|D|B|X|N|\.|\-]+"/>
            <xs:minLength value="1" />
        </xs:restriction>
    </xs:simpleType>
    <!--...............................................................................................-->
    <xs:simpleType name="aaSeq">
        <xs:annotation>
            <xs:documentation>Type used for Protein sequence</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Z|\.|\-|\*]+"/>
            <xs:minLength value="1" />
        </xs:restriction>
    </xs:simpleType>
    <!--...............................................................................................-->
</xs:schema>
