<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.nexml.org/1.0"
    xmlns="http://www.nexml.org/1.0" xmlns:xml="http://www.w3.org/XML/1998/namespace">
    <xs:include schemaLocation="abstractcharacters.xsd"/>
    
    <!--
    <xs:import namespace="http://www.w3.org/XML/1998/namespace"
        schemaLocation="http://www.w3.org/2001/xml.xsd"/>-->
    <xs:annotation>
        <xs:documentation>
            This module defines concrete subclasses for the 
            <a href="../abstract">abstract</a> character matrix components 
            that all character matrices must implement. The subclasses
            defined here apply to restriction site data. In a verbose notation, 
            this data is represented as the "state" attribute of the &lt;cell&gt; 
            element, whose value-space is limited to 0 or 1. In a compact 
            notation, the same data is represented as a sequence of tokens (whitespace is allowed but has no meaning).
        </xs:documentation>
    </xs:annotation>     
    <xs:simpleType name="RestrictionToken">
        <xs:restriction base="xs:integer">
            <xs:minInclusive value="0"/>
            <xs:maxInclusive value="1"/>
        </xs:restriction>
    </xs:simpleType>
    
    <!--
        A restriction site matrix only has presence (1) or absence (0), so
        state definitions and ambiguity mappings are omitted.
        
    <xs:complexType name="StandardMapping">
        <xs:annotation>
            <xs:documentation>A standard character ambiguity mapping.</xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractMapping"/>            
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="StandardState">
        <xs:annotation>
            <xs:documentation> This is a concrete implementation of the state element, which requires
                a symbol element, in this case restricted to integers, and optional mapping
                elements to refer to other states. </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractState">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="dict" minOccurs="0" maxOccurs="unbounded" type="Dict"/>
                    <xs:element name="symbol" type="StandardToken" minOccurs="1" maxOccurs="1"/>
                    <xs:element name="mapping" type="StandardMapping" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="StandardStates">
        <xs:annotation>
            <xs:documentation>
                A container for a set of states.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractStates">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="dict" minOccurs="0" maxOccurs="unbounded" type="Dict"/>
                    <xs:element name="state" type="StandardState" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>        
    </xs:complexType>
    -->
    <xs:complexType name="RestrictionChar">
        <xs:annotation>
            <xs:documentation> 
                A concrete implementation of the char element, 
                which only requires a unique identifier.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractChar">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="dict" minOccurs="0" maxOccurs="unbounded" type="Dict"/>
                </xs:sequence>    
                <xs:attribute name="tokens" type="MSTokenLength" use="prohibited"/>            
                <xs:attribute name="states" type="xs:NCName" use="prohibited"/>
                <xs:attribute name="codon" type="CodonPosition" use="prohibited"/>
                <xs:attribute name="id" type="xs:NCName" use="required"/>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="RestrictionFormat" abstract="false">
        <xs:annotation>
            <xs:documentation> The RestrictionFormat class is the container of restriction column definitions.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractFormat">
                <xs:sequence minOccurs="1" maxOccurs="1">
<!--                    <xs:element name="states" type="StandardStates" minOccurs="1" maxOccurs="unbounded"/> -->
                    <xs:element name="char" type="RestrictionChar" minOccurs="1" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="RestrictionObs" abstract="false">
        <xs:annotation>
            <xs:documentation> 
                This is a single cell in a matrix containing a 
                restriction site observation.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractObs">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="dict" minOccurs="0" maxOccurs="unbounded" type="Dict"/>
                </xs:sequence>
                <xs:attribute name="char" use="required" type="xs:nonNegativeInteger"/>
                <xs:attribute name="state" use="required" type="RestrictionToken"/>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:simpleType name="RestrictionSeq">
        <xs:annotation>
            <xs:documentation> 
                This is a simple type that specifies a 
                sequence of restriction site characters.
            </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[01\s]*"></xs:pattern>
        </xs:restriction>
    </xs:simpleType>
    
    <xs:complexType name="RestrictionMatrixSeqRow" abstract="false">
        <xs:annotation>
            <xs:documentation>
                This is a row in a matrix of restriction 
                site data as character sequences. 
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractSeqRow">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="dict" minOccurs="0" maxOccurs="unbounded" type="Dict"/>
                    <xs:element name="seq" minOccurs="1" maxOccurs="1" type="RestrictionSeq"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="RestrictionMatrixObsRow" abstract="false">
        <xs:annotation>
            <xs:documentation> 
                This is a row in a matrix of restriction 
                site data as granular obervations. 
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractObsRow">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="dict" minOccurs="0" maxOccurs="unbounded" type="Dict"/>
                    <xs:element name="cell" minOccurs="1" maxOccurs="unbounded" type="RestrictionObs"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="RestrictionSeqMatrix" abstract="false">
        <xs:annotation>
            <xs:documentation>
                A matrix of rows with seq strings of type restriction.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractSeqMatrix">
                <xs:sequence minOccurs="1" maxOccurs="1">                    
                    <xs:element name="row" minOccurs="1" maxOccurs="unbounded" type="RestrictionMatrixSeqRow"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="RestrictionObsMatrix" abstract="false">
        <xs:annotation>
            <xs:documentation>
                A matrix of rows with single character observations.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractObsMatrix">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="row" minOccurs="1" maxOccurs="unbounded" type="RestrictionMatrixObsRow"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="RestrictionSeqs" abstract="false">
        <xs:annotation>
            <xs:documentation>
                A restriction site characters block 
                consisting of sequences preceded by metadata.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractSeqs">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="dict" minOccurs="0" maxOccurs="unbounded" type="Dict"/>
                    <xs:element name="format" minOccurs="0" maxOccurs="1" type="RestrictionFormat"/>
                    <xs:element name="matrix" minOccurs="1" maxOccurs="1" type="RestrictionSeqMatrix"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="RestrictionCells" abstract="false">
        <xs:annotation>
            <xs:documentation>
                A standard characters block consisting 
                of granular cells preceded by metadata.
            </xs:documentation>
        </xs:annotation>
        <xs:complexContent>
            <xs:restriction base="AbstractCells">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="dict" minOccurs="0" maxOccurs="unbounded" type="Dict"/>
                    <xs:element name="format" minOccurs="1" maxOccurs="1" type="RestrictionFormat"/>
                    <xs:element name="matrix" minOccurs="1" maxOccurs="1" type="RestrictionObsMatrix"/>                   
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    
</xs:schema>
