<?xml version="1.0" encoding="utf-16"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
           targetNamespace="http://www.unilever.com/URDPS/HTS/EMS_XML_Results"
           xmlns="http://www.unilever.com/URDPS/HTS/EMS_XML_Results" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <!-- The root element -->
    <xs:element name="importData">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="resultParameters" type="resultParametersStructure" minOccurs="0" maxOccurs="1" />
                <xs:element name="project" type="projectStructure" />
            </xs:sequence>
            <xs:attribute name="overwrite" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="yes" />
                        <xs:enumeration value="append" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="resultType" use="optional">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="Standard" />
                        <xs:enumeration value="Stability" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <!-- result parameters -->
    <xs:complexType name="resultParametersStructure">
        <xs:sequence>
            <!-- must be at least 1 parameter if the parent exists -->
            <xs:element name="resultParameter" minOccurs="1" 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>

    <!-- General structure of results -->
    <xs:complexType name="projectStructure">
        <xs:sequence>
            <xs:element name="study">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="experiment">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="plate">
                                        <xs:complexType>
                                            <xs:sequence>
                                                <!-- we currently only cater for results against individual wells -->
                                                <xs:element name="well" type="resultEntity"/>
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <!-- a re-usable type for an entity that can have result sets stored against it -->
    <xs:complexType name="resultEntity">
        <xs:sequence>
            <!-- the result set -->
            <xs:element name="rs" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:sequence>
                        <!-- single results -->
                        <xs:element name="res" minOccurs="0" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="xs:string">
                                        <xs:attribute name="name" type="xs:string" use="required" />
                                        <xs:attribute name="propertyName" type="xs:string" use="optional" />
                                        <xs:attribute name="units" type="xs:string" use="optional" />
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                        <!-- x-y results are optional -->
                        <!-- each x data can have multiple y data -->
                        <!-- an x must have at least one y, and y cannot exist without an x -->
                        <!-- there can be multiple x data, we achieve this by grouping the entire sequence together -->
                        <xs:sequence minOccurs="0" maxOccurs="unbounded">
                            <!-- x data -->
                            <xs:element name="xData" minOccurs="1" maxOccurs="1">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="res" minOccurs="1" maxOccurs="unbounded" type="xs:string" />
                                    </xs:sequence>
                                    <xs:attribute name="seriesName" type="xs:string" use="required" />
                                    <xs:attribute name="name" type="xs:string" use="required" />
                                    <!-- id of the x data so that y data can refer to a specific x data -->
                                    <xs:attribute name="id" type="xs:ID" use="required" />
                                </xs:complexType>
                            </xs:element>
                            <!-- y data -->
                            <xs:element name="yData" minOccurs="1" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <!-- context result-->
                                        <xs:element name="context" type="contextStructure" minOccurs="0" maxOccurs="1" />
                                        <xs:element name="res" minOccurs="1" maxOccurs="unbounded" type="xs:string" />
                                    </xs:sequence>
                                    <xs:attribute name="seriesName" type="xs:string" use="required" />
                                    <xs:attribute name="name" type="xs:string" use="required" />
                                    <!-- the x data to which this y data belongs -->
                                    <xs:attribute name="idref" type="xs:IDREF" use="required" />
                                    <xs:attribute name="units" type="xs:string" use="optional" />
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:sequence>
                    <xs:attribute name="measureDate" type="xs:dateTime" use="required" />
                    <xs:attribute name="overwrite" use="optional">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="yes" />
                                <xs:enumeration value="append" />
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:attribute>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <!-- primary key attribute to uniquely identify the entity -->
        <xs:attribute name="pk" type="xs:unsignedLong" use="required" />
    </xs:complexType>

    <!-- context result -->
    <xs:complexType name="contextStructure">
        <xs:sequence>
            <!-- must be at least 1 single result if the parent exists -->
            <xs:element name="res" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="name" type="xs:string" use="required" />
                            <xs:attribute name="units" type="xs:string" use="optional" />
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

</xs:schema>