<?xml version="1.0" encoding="UTF-8" ?>
<!--
    NamesforLife Exemplar Information Object XML Schema

    Copyright (c) 2024, The Regents of the University of California, through
    Lawrence Berkeley National Laboratory (subject to receipt of any required
    approvals from the U.S. Dept. of Energy). All rights reserved.

    CLOCKSS system has permission to ingest, preserve, and serve this Archival Unit.
    LOCKSS system has permission to collect, preserve, and serve this Archival Unit.

    This content is licensed under a Creative Commons Attribution 3.0 International license.
    https://creativecommons.org/licenses/by/3.0/
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://namesforlife.com/ns/exemplar" targetNamespace="http://namesforlife.com/ns/exemplar" xmlns:reference="http://namesforlife.com/ns/reference" xmlns:common="http://namesforlife.com/ns/common" elementFormDefault="qualified">

    <xs:import schemaLocation="reference.xsd" namespace="http://namesforlife.com/ns/reference" />
    <xs:import schemaLocation="common.xsd" namespace="http://namesforlife.com/ns/common" />

    <!-- The exemplar container document element. -->
    <xs:element name="exemplars" type="exemplarListType" />
    
    <!-- The document element for a NamesforLife Exemplar Information Object. -->
    <xs:element name="exemplar" type="exemplarType" />

    <!-- A container type for exemplars. -->
    <xs:complexType name="exemplarListType">
        <xs:sequence>
            <xs:element name="exemplar" type="exemplarType" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <!-- Top level type for a NamesforLife Exemplar Information Object, corresponding to 10.1601/ex.##### -->
    <xs:complexType name="exemplarType">
        <xs:complexContent>
            <xs:extension base="common:informationObjectType">
                <xs:sequence>
                    <xs:element name="biosafety-level" type="bioSafetyLevelType" minOccurs="0" maxOccurs="1" />
                    <xs:element name="variant" type="variantType" minOccurs="0" maxOccurs="unbounded" />
                    <xs:element name="identifiers" type="identifierCollectionType" minOccurs="1" maxOccurs="1" />
                    <xs:element name="features" type="featureCollectionType" minOccurs="1" maxOccurs="1" />
                    <xs:element ref="common:nomenclature" minOccurs="0" maxOccurs="1" />
                    <!-- The (optional) bibliography for this record. -->
                    <xs:element ref="reference:bibliography" minOccurs="0" maxOccurs="1" />
                    <!-- Annotation for the record. -->
                    <xs:element ref="common:annotation" minOccurs="0" maxOccurs="1" />
                </xs:sequence>
                <xs:attribute name="is-uncultivated" type="xs:boolean" use="required" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- A culture deposit or strain identifier. -->
    <xs:complexType name="identifierType">
        <xs:attribute name="label" type="xs:string" use="required" />
        <!-- source of data (see sourceEnumType) -->
        <!--
            <xs:attribute name="source" type="sourceEnumType" use="required" />
        -->
        <xs:attribute name="source" type="xs:string" use="required" />
        <xs:attribute name="reference" type="reference:referenceIdType" use="optional" />
        <xs:attribute name="collection" type="xs:string" use="optional" />
        <xs:attribute name="accession" type="xs:string" use="optional" />

        <xs:attribute name="is-laboratory-identifier" type="xs:boolean" use="required" />
        <xs:attribute name="is-mixed-culture" type="xs:boolean" use="required" />
        <xs:attribute name="is-non-viable" type="xs:boolean" use="required" />
        <xs:attribute name="is-patent" type="xs:boolean" use="required" />
        <xs:attribute name="is-symbiont" type="xs:boolean" use="required" />
        <xs:attribute name="is-unavailable" type="xs:boolean" use="required" />
        <xs:attribute name="is-variant" type="xs:boolean" use="required" />
    </xs:complexType>

    <!-- A feature. -->
    <xs:complexType name="featureType">
        <xs:sequence>
            <xs:element name="sequence-note" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="range" type="rangeType" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required" />
        <xs:attribute name="code" type="xs:string" use="required" /> <!-- feature class code -->
        <xs:attribute name="description" type="xs:string" use="required" /> <!-- feature class description -->
        <!-- source of data (see sourceEnumType) -->
        <!--
            <xs:attribute name="source" type="sourceEnumType" use="required" />
        -->
        <xs:attribute name="source" type="xs:string" use="required" />
        <xs:attribute name="reference" type="reference:referenceIdType" use="optional" />
        <xs:attribute name="url" type="xs:anyURI" use="optional" />
    </xs:complexType>

    <xs:complexType name="rangeType">
        <xs:simpleContent>
            <xs:extension base="xs:token">
                <xs:attribute name="from" type="xs:integer" use="required" />
                <xs:attribute name="to" type="xs:integer" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="identifierCollectionType">
        <xs:sequence>
            <xs:element name="identifier" type="identifierType" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="featureCollectionType">
        <xs:sequence>
            <xs:element name="feature" type="featureType" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="bioSafetyLevelType">
        <xs:attribute name="code" type="xs:string" use="required" />
        <xs:attribute name="label" type="xs:string" use="required" />
    </xs:complexType>

    <xs:complexType name="variantType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="code" type="xs:string" use="required" />
                <xs:attribute name="label" type="xs:string" use="required" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

</xs:schema>
