<?xml version=“1.0” encoding=“UTF-8”?> <xs:schema

xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.nexml.org/2009"
xmlns="http://www.nexml.org/2009"
elementFormDefault="qualified">
<xs:annotation>
    <xs:documentation>
        This module defines the components of trees, graphs 
        where edges have an in-degree that of 1. The
        types defined in this module are concrete implementations
        that inherit from the abstract types in the <a href="../abstract">
            abstract trees module</a>.<br /><br /> 
        Depending on the concrete subclass, edges in trees either
        have lengths formatted as integers or lengths formatted as
        floating point numbers.
    </xs:documentation>
</xs:annotation>    

<xs:include schemaLocation="abstracttrees.xsd"/>

<xs:complexType name="TreeNode" abstract="false">
    <xs:annotation>
        <xs:documentation>
            A concrete node implementation.
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:restriction base="AbstractNode">
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="meta" type="Meta" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<!--
<xs:complexType name="TreeEdge" abstract="false">
    <xs:annotation>
        <xs:documentation>
            A concrete edge implementation, no length type specified.
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="AbstractEdge"/>            
    </xs:complexContent>
</xs:complexType> 
-->
<xs:complexType name="TreeFloatEdge" abstract="false">
    <xs:annotation>
        <xs:documentation>
            A concrete edge implementation, with float length.
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:restriction base="AbstractEdge">
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="meta" type="Meta" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>                
            <xs:attribute name="length" type="xs:float"/>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="TreeFloatRootEdge" abstract="false">
    <xs:annotation>
        <xs:documentation>
            A concrete root edge implementation, with float length.
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:restriction base="AbstractRootEdge">
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="meta" type="Meta" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>                
            <xs:attribute name="length" type="xs:float"/>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>    

<xs:complexType name="TreeIntEdge" abstract="false">
    <xs:annotation>
        <xs:documentation>
            A concrete edge implementation, with int length.
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:restriction base="AbstractEdge">
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="meta" type="Meta" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>                
            <xs:attribute name="length" type="xs:integer"/>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>    

<xs:complexType name="TreeIntRootEdge" abstract="false">
    <xs:annotation>
        <xs:documentation>
            A concrete root edge implementation, with int length.
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:restriction base="AbstractRootEdge">
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="meta" type="Meta" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>                
            <xs:attribute name="length" type="xs:integer"/>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>    

<xs:complexType name="FloatTree" abstract="false">
    <xs:annotation>
        <xs:documentation>
            A concrete tree implementation, with floating point edge lengths.
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:restriction base="AbstractTree">
            <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="meta" type="Meta" minOccurs="0" maxOccurs="unbounded"/>                       
                <xs:element minOccurs="1" maxOccurs="unbounded" name="node" type="TreeNode"/>
                <xs:element minOccurs="0" maxOccurs="1" name="rootedge" type="TreeFloatRootEdge"/>
                <xs:element minOccurs="1" maxOccurs="unbounded" name="edge" type="TreeFloatEdge"/>
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>   

<xs:complexType name="IntTree" abstract="false">
    <xs:annotation>
        <xs:documentation>
            A concrete tree implementation, with integer edge lengths.
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:restriction base="AbstractTree">
            <xs:sequence minOccurs="1" maxOccurs="1">
                                    <xs:element name="meta" type="Meta" minOccurs="0" maxOccurs="unbounded"/>                
                <xs:element minOccurs="1" maxOccurs="unbounded" name="node" type="TreeNode"/>
                <xs:element minOccurs="0" maxOccurs="1" name="rootedge" type="TreeIntRootEdge"/>
                <xs:element minOccurs="1" maxOccurs="unbounded" name="edge" type="TreeIntEdge"/>
            </xs:sequence>
        </xs:restriction>
    </xs:complexContent>
</xs:complexType>

</xs:schema>