<?xml version="1.0" encoding="UTF-8" ?>
<!--
    NamesforLife Reference Record 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/reference" targetNamespace="http://namesforlife.com/ns/reference" elementFormDefault="qualified">

    <!--
        An XHTML-compatible tag set for formatting article titles.
        This is reproduced here to avoid namespace changes in the middle of mixed content,
        which would not be supported by web-based editors.
    -->
    <xs:group name="styleGroup">
        <xs:choice>
            <xs:element name="b" type="boldType" />
            <xs:element name="i" type="italicType" />
        </xs:choice>
    </xs:group>

    <xs:group name="phraseGroup">
        <xs:choice>
            <xs:element name="em" type="emphasisType" />
            <xs:element name="sub" type="subscriptType" />
            <xs:element name="sup" type="superscriptType" />
        </xs:choice>
    </xs:group>

    <xs:group name="inlineType">
        <xs:choice>
            <xs:group ref="styleGroup" />
            <xs:group ref="phraseGroup" />
        </xs:choice>
    </xs:group>

    <xs:complexType name="inlineContentType" mixed="true">
        <xs:annotation>
            <xs:documentation>
                "Inline" covers inline or "text-level" elements
            </xs:documentation>
        </xs:annotation>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:group ref="inlineType" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="boldType" mixed="true">
        <xs:complexContent>
            <xs:extension base="inlineContentType" />
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="emphasisType" mixed="true">
        <xs:complexContent>
            <xs:extension base="inlineContentType" />
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="italicType" mixed="true">
        <xs:complexContent>
            <xs:extension base="inlineContentType" />
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="subscriptType" mixed="true">
        <xs:complexContent>
            <xs:extension base="inlineContentType" />
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="superscriptType" mixed="true">
        <xs:complexContent>
            <xs:extension base="inlineContentType" />
        </xs:complexContent>
    </xs:complexType>

    <!-- Bibliography type: A collection of references. -->
    <xs:complexType name="bibliographyType">
        <xs:sequence>
            <xs:element name="reference" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <!-- A reference id is not a DOI, but an internal identifier: rid.nvp or rid.##### or jc.### -->
    <xs:simpleType name="referenceIdType">
        <xs:restriction base="xs:string">
            <xs:pattern value="rid\.nvp" />
            <xs:pattern value="rid\.\d+" />
            <xs:pattern value="jc\.\d+" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="referenceMetaType">
        <xs:attribute name="id" type="referenceIdType" />
    </xs:complexType>

    <!-- Top level type for a reference record, corresponding to rid.##### -->
    <xs:complexType name="referenceType">
        <xs:complexContent>
            <xs:extension base="referenceMetaType">
                <xs:sequence>
                    <xs:element name="citation" type="citationType" minOccurs="1" maxOccurs="1" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="opinionReferenceType">
        <xs:complexContent>
            <xs:extension base="referenceMetaType">
                <xs:attribute name="date" type="xs:string" />
                <xs:attribute name="type" type="xs:string" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- The reference document element. -->
    <xs:element name="reference" type="referenceType" />

    <!-- The bibliography document element. -->
    <xs:element name="bibliography" type="bibliographyType" />

    <!-- Abstracted from main schema to facilitate switching between citation models. -->
    <xs:complexType name="citationType">
        <xs:sequence>
            <xs:element name="authors" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="person-name" type="personNameType" minOccurs="0" maxOccurs="unbounded" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="editors" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="person-name" type="personNameType" minOccurs="0" maxOccurs="unbounded" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="article-title" type="inlineContentType" minOccurs="0" maxOccurs="1" />
            <xs:element name="year" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="volume" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="issue" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="edition" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="fpage" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="lpage" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="source" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="id" type="xs:integer" />
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="patent" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="institution" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="label" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="publisher-name" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="publisher-loc" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="abbrev" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="isbn" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="issn" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="essn" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="pub-id" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="pub-id-type" type="pubIdTypeEnumType" use="required" />
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="model" use="optional"/>
        <xs:attribute name="citation-type" type="citationTypeEnumType" use="required" />
    </xs:complexType>
    
    <xs:simpleType name="citationTypeEnumType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="journal" />
            <xs:enumeration value="book" />
            <xs:enumeration value="thesis" />
            <xs:enumeration value="patent" />
            <xs:enumeration value="unpublished" />
        </xs:restriction>
    </xs:simpleType>
    
    <xs:simpleType name="pubIdTypeEnumType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="pmid" />
            <xs:enumeration value="doi" />
        </xs:restriction>
    </xs:simpleType>
    
    <xs:complexType name="personNameType">
        <xs:sequence>
            <xs:element name="surname" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="given-names" type="xs:string" minOccurs="0" maxOccurs="1" />
            <xs:element name="suffix" type="xs:string" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

</xs:schema>
