<?xml version="1.0" encoding="UTF-8" ?>
<!--
    NamesforLife Name 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/name" targetNamespace="http://namesforlife.com/ns/name" xmlns:reference="http://namesforlife.com/ns/reference" xmlns:taxon="http://namesforlife.com/ns/taxon" xmlns:exemplar="http://namesforlife.com/ns/exemplar" xmlns:common="http://namesforlife.com/ns/common" elementFormDefault="qualified">

    <xs:import schemaLocation="reference.xsd" namespace="http://namesforlife.com/ns/reference" />
    <xs:import schemaLocation="taxon.xsd" namespace="http://namesforlife.com/ns/taxon" />
    <xs:import schemaLocation="exemplar.xsd" namespace="http://namesforlife.com/ns/exemplar" />
    <xs:import schemaLocation="common.xsd" namespace="http://namesforlife.com/ns/common" />
    
    <!-- The document element for a NamesforLife Name Information Object. -->
    <xs:element name="name" type="nameType" />

    <xs:complexType name="nameIdentifierType">
        <xs:complexContent>
            <xs:extension base="common:informationObjectType">
                <xs:sequence>
                    <xs:element ref="common:nomenclature" minOccurs="1" maxOccurs="1" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    
    <!-- Top level type for a NamesforLife Name Information Object, corresponding to 10.1601/nm.##### -->
    <xs:complexType name="nameType">
        <xs:complexContent>
            <xs:extension base="nameIdentifierType">
                <xs:sequence>
                    <xs:element name="events" minOccurs="1" maxOccurs="1">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="event" type="eventType" minOccurs="0" maxOccurs="unbounded" />
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>

                    <xs:element ref="taxon:taxon" minOccurs="1" maxOccurs="1" />

                    <xs:element name="synonyms" minOccurs="0" maxOccurs="1">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="synonyms-from">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="synonym" type="synonymType" minOccurs="0" maxOccurs="unbounded" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                                <xs:element name="synonyms-to">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="synonym" type="synonymType" minOccurs="0" maxOccurs="unbounded" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                    <xs:element ref="reference:bibliography" minOccurs="0" maxOccurs="1" />
                    <xs:element ref="common:annotation" minOccurs="0" maxOccurs="1" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- Metadata for a correction for a name. -->
    <xs:complexType name="correctionIdentifierType">
        <xs:attribute name="from-doi" type="common:doiType" use="required" />
        <xs:attribute name="from-name" type="xs:string" use="required" />
        <xs:attribute name="from-status" type="xs:string" use="optional" />
        <xs:attribute name="to-status" type="xs:string" use="optional" />
        <xs:attribute name="to-doi" type="common:doiType" use="required" />
        <xs:attribute name="to-name" type="xs:string" use="required" />
    </xs:complexType>

    <!-- A synonym for a name. A synonym is a directed edge between two taxa. The nomenclature contained by a synonym is for the 'other' name referred to in the synonym. -->
    <xs:complexType name="synonymType">
        <xs:complexContent>
            <xs:extension base="common:nomenclatureType">
                <xs:attribute name="date" type="xs:gYear" use="required" /> <!-- Part of event. -->
                <xs:attribute name="reference" type="reference:referenceIdType" use="required" /> <!-- Part of event. -->
                <xs:attribute name="type" type="synonymEnumType" use="required" />
                <xs:attribute name="from" type="common:doiType" use="required" />
                <xs:attribute name="to" type="common:doiType" use="required" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- Enumeration of supported synonym types. -->
    <xs:simpleType name="synonymEnumType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="basonym" />
            <xs:enumeration value="new combination" />
            <xs:enumeration value="heterotypic" />
            <xs:enumeration value="homotypic" />
            <xs:enumeration value="unification" />
            <xs:enumeration value="rank elevation" />
            <xs:enumeration value="rank reduction" />
            <xs:enumeration value="replacement" />
            <xs:enumeration value="conservation" />
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="eventEnumType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="validation" />
            <xs:enumeration value="effective-publication" />
            <xs:enumeration value="emendation" />
            <xs:enumeration value="judicial-opinion" />
            <xs:enumeration value="correction" />
            <xs:enumeration value="revived" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="opinionType">
        <xs:sequence>
            <xs:element name="curatorial-note" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="public-note" type="xs:string" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
        <xs:attribute name="opinion-type" type="xs:string" use="optional" />
        <xs:attribute name="opinion-number" type="xs:int" use="optional" />
    </xs:complexType>

    <xs:complexType name="eventType">
        <xs:sequence>
            <xs:element name="correction" type="correctionIdentifierType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="opinion" type="opinionType" minOccurs="0" maxOccurs="unbounded" />
            <xs:element name="references" type="referencesType" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
        <xs:attribute name="date" type="xs:gYear" use="required" />
        <xs:attribute name="list-number" type="xs:int" use="optional" />
        <xs:attribute name="reference" type="reference:referenceIdType" use="required" />
        <xs:attribute name="type" type="eventEnumType" use="required" />
    </xs:complexType>

    <xs:complexType name="referencesType">
        <xs:sequence>
            <xs:element name="reference" type="reference:opinionReferenceType" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

</xs:schema>
