<?xml version="1.0" encoding="utf-8" ?>

<xs:schema xmlns="http://www.memoriedigitaliliguri.it/schema/" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.memoriedigitaliliguri.it/schema/" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <!--Definizioni tipi -->
    <xs:simpleType name="notEmptyStringType">
        <xs:restriction base="xs:string">
            <xs:minLength value="1" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="projectIdentifierBlockType">
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element ref="systemIdentifier" minOccurs="1" maxOccurs="1" />
            <xs:element ref="referenceNumber" minOccurs="1" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="qualificaType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Data di redazione" />
            <xs:enumeration value="Data topica" />
            <xs:enumeration value="Ubicazione di oggetto menzionato nel documento" />
            <xs:enumeration value="Data di realizzazione" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="projectSourceBlockType">
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element ref="source" minOccurs="1" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="languageType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Italiano" />
            <xs:enumeration value="Inglese" />
            <xs:enumeration value="Francese" />
            <xs:enumeration value="Greco" />
            <xs:enumeration value="Olandese" />
            <xs:enumeration value="Portoghese" />
            <xs:enumeration value="Russo" />
            <xs:enumeration value="Spagnolo" />
            <xs:enumeration value="Tedesco" />
            <xs:enumeration value="Latino" />
            <xs:enumeration value="Norvegese" />
            <xs:enumeration value="Polacco" />
            <xs:enumeration value="Rumeno" />
            <xs:enumeration value="Svedese" />
            <xs:enumeration value="Ungherese" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="issueIdentifierBlockType">
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element ref="systemIdentifier" minOccurs="1" maxOccurs="1" />

            <xs:element name="internationalNumberBlock" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence minOccurs="1" maxOccurs="1">
                        <xs:element name="internationalNumber" minOccurs="1" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:simpleContent>
                                    <xs:extension base="notEmptyStringType">
                                        <xs:attribute name="type" use="required">
                                            <xs:simpleType>
                                                <xs:restriction base="xs:string">
                                                    <xs:enumeration value="ISBN" />
                                                    <xs:enumeration value="ISSN" />
                                                </xs:restriction>
                                            </xs:simpleType>
                                        </xs:attribute>

                                        <xs:attribute name="qualifier" use="required">
                                            <xs:simpleType>
                                                <xs:restriction base="xs:string">
                                                    <xs:enumeration value="Stampato" />
                                                    <xs:enumeration value="Digitale PDF" />
                                                    <xs:enumeration value="Digitale ePub" />
                                                </xs:restriction>
                                            </xs:simpleType>
                                        </xs:attribute>
                                    </xs:extension>
                                </xs:simpleContent>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

            <xs:element name="copyBlock" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:sequence minOccurs="1" maxOccurs="1">
                        <xs:element name="copy" minOccurs="1" maxOccurs="unbounded">
                            <xs:complexType>
                                <xs:sequence minOccurs="1" maxOccurs="1">
                                    <xs:element ref="referenceNumber" minOccurs="1" maxOccurs="1" />
                                    <xs:element ref="inventoryNumber" minOccurs="1" maxOccurs="1" />

                                    <xs:element name="holdingInstitution" minOccurs="1" maxOccurs="1">
                                        <xs:complexType>
                                            <xs:simpleContent>
                                                <xs:extension base="notEmptyStringType">
                                                    <xs:attribute name="alias" type="notEmptyStringType" use="required" />
                                                </xs:extension>
                                            </xs:simpleContent>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="issueSourceBlockType">
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element ref="source" minOccurs="1" maxOccurs="3" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="creatorBlockType">
        <xs:sequence minOccurs="1" maxOccurs="1">
            <xs:element name="creator" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="notEmptyStringType">
                            <xs:attribute name="alias" type="notEmptyStringType" use="required" />

                            <xs:attribute name="authorship" use="required">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:enumeration value="Autore" />
                                        <xs:enumeration value="Curatore" />
                                        <xs:enumeration value="Traduttore" />
                                        <xs:enumeration value="Illustratore" />
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:attribute>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <!--Definizioni elementi riutilizzabili -->
    <xs:element name="systemIdentifier" type="xs:positiveInteger" />
    <xs:element name="referenceNumber" type="notEmptyStringType" />

    <xs:element name="source">
        <xs:simpleType>
            <xs:restriction base="xs:anyURI">
                <xs:minLength value="1" />
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

    <xs:element name="originalTitle" type="notEmptyStringType" />
    <xs:element name="assignedTitle" type="notEmptyStringType" />
    <xs:element name="description" type="notEmptyStringType" />

    <xs:element name="dateBlock">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="date" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="type" type="qualificaType" use="required" />
                                <xs:attribute name="startDate" type="notEmptyStringType" use="optional" />
                                <xs:attribute name="endDate" type="notEmptyStringType" use="optional" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="locationBlock">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="location" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="notEmptyStringType">
                                <xs:attribute name="alias" type="notEmptyStringType" use="required" />
                                <xs:attribute name="type" type="qualificaType" use="required" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="subjectBlock">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="subject" minOccurs="1" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="notEmptyStringType">
                                <xs:attribute name="language" type="languageType" use="required" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="item">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="identifierBlock" type="projectIdentifierBlockType" minOccurs="1" maxOccurs="1" />
                <xs:element ref="originalTitle" minOccurs="0" maxOccurs="1" />
                <xs:element ref="assignedTitle" minOccurs="0" maxOccurs="1" />
                <xs:element ref="description" minOccurs="0" maxOccurs="1" />
                <xs:element name="language" type="languageType" minOccurs="0" maxOccurs="1" />
                <xs:element ref="dateBlock" minOccurs="0" maxOccurs="1" />
                <xs:element ref="locationBlock" minOccurs="0" maxOccurs="1" />
                <xs:element ref="subjectBlock" minOccurs="0" maxOccurs="1" />

                <xs:element name="contributorBlock" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence minOccurs="1" maxOccurs="1">
                            <xs:element name="contributor" minOccurs="1" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="notEmptyStringType">
                                            <xs:attribute name="alias" type="notEmptyStringType" use="required" />

                                            <xs:attribute name="authorship" use="required">
                                                <xs:simpleType>
                                                    <xs:restriction base="xs:string">
                                                        <xs:enumeration value="Autore" />
                                                        <xs:enumeration value="Traduttore" />
                                                        <xs:enumeration value="Copista" />
                                                        <xs:enumeration value="Proprietario di bene citato" />
                                                        <xs:enumeration value="Committente di attività o opera" />
                                                        <xs:enumeration value="Progettista" />
                                                        <xs:enumeration value="Scultore" />
                                                        <xs:enumeration value="Esecutore" />
                                                        <xs:enumeration value="Ingegnere" />
                                                        <xs:enumeration value="Marmista" />
                                                        <xs:enumeration value="Richiedente" />
                                                        <xs:enumeration value="Destinatario" />
                                                        <xs:enumeration value="Architetto" />
                                                    </xs:restriction>
                                                </xs:simpleType>
                                            </xs:attribute>
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

                <xs:element name="sourceBlock" type="projectSourceBlockType" minOccurs="0" maxOccurs="1" />
                <xs:element ref="item" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>

            <xs:attribute name="type" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="Registro" />
                        <xs:enumeration value="Volume" />
                        <xs:enumeration value="Busta" />
                        <xs:enumeration value="Fascicolo" />
                        <xs:enumeration value="Sotto-fascicolo" />
                        <xs:enumeration value="Filza" />
                        <xs:enumeration value="Quaderno" />
                        <xs:enumeration value="Rotolo" />
                        <xs:enumeration value="Mazzo" />
                        <xs:enumeration value="Involto" />
                        <xs:enumeration value="Plico" />
                        <xs:enumeration value="Inserto" />
                        <xs:enumeration value="Documento" />
                        <xs:enumeration value="Rubrica" />
                        <xs:enumeration value="Unità" />
                        <xs:enumeration value="Stampa" />
                        <xs:enumeration value="Album" />
                        <xs:enumeration value="Targa" />
                        <xs:enumeration value="Framento" />
                        <xs:enumeration value="Spartito" />
                        <xs:enumeration value="Disegno" />
                        <xs:enumeration value="Fotografia" />
                        <xs:enumeration value="Biglietto" />
                        <xs:enumeration value="Scatola" />
                        <xs:enumeration value="Cartella" />
                        <xs:enumeration value="Codice" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="collection">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="identifierBlock" type="projectIdentifierBlockType" minOccurs="1" maxOccurs="1" />
                <xs:element ref="originalTitle" minOccurs="0" maxOccurs="1" />
                <xs:element ref="assignedTitle" minOccurs="0" maxOccurs="1" />
                <xs:element ref="dateBlock" minOccurs="0" maxOccurs="1" />
                <xs:element ref="locationBlock" minOccurs="0" maxOccurs="1" />
                <xs:element ref="subjectBlock" minOccurs="0" maxOccurs="1" />

                <xs:element name="contributorBlock" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:sequence minOccurs="1" maxOccurs="1">
                            <xs:element name="contributor" minOccurs="1" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:simpleContent>
                                        <xs:extension base="notEmptyStringType">
                                            <xs:attribute name="alias" type="notEmptyStringType" use="required" />

                                            <xs:attribute name="authorship" use="required">
                                                <xs:simpleType>
                                                    <xs:restriction base="xs:string">
                                                        <xs:enumeration value="Soggetto produttore" />
                                                        <xs:enumeration value="Copista" />
                                                    </xs:restriction>
                                                </xs:simpleType>
                                            </xs:attribute>
                                        </xs:extension>
                                    </xs:simpleContent>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>

                <xs:element name="sourceBlock" type="projectSourceBlockType" minOccurs="0" maxOccurs="1" />

                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="collection" minOccurs="1" maxOccurs="1" />
                    <xs:element ref="item" minOccurs="1" maxOccurs="1" />
                </xs:choice>
            </xs:sequence>

            <xs:attribute name="type" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="Complesso di fondi" />
                        <xs:enumeration value="Fondo" />
                        <xs:enumeration value="Classe" />
                        <xs:enumeration value="Sotto-classe" />
                        <xs:enumeration value="Parte" />
                        <xs:enumeration value="Categoria" />
                        <xs:enumeration value="Sotto-Categoria" />
                        <xs:enumeration value="Titolo" />
                        <xs:enumeration value="Sezione" />
                        <xs:enumeration value="Materia" />
                        <xs:enumeration value="Serie" />
                        <xs:enumeration value="Sotto-serie" />
                        <xs:enumeration value="Collezione" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>

    <xs:element name="inventoryNumber" type="xs:positiveInteger" />

    <xs:element name="publisher">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="notEmptyStringType">
                    <xs:attribute name="alias" type="notEmptyStringType" use="required" />
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>

    <xs:element name="subordinateEnumeration" type="notEmptyStringType" />

    <xs:element name="publicationInfo">
        <xs:complexType>
            <xs:choice minOccurs="1" maxOccurs="1">
                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="location" minOccurs="1" maxOccurs="1">
                        <xs:complexType>
                            <xs:simpleContent>
                                <xs:extension base="notEmptyStringType">
                                    <xs:attribute name="alias" type="notEmptyStringType" use="optional" />
                                </xs:extension>
                            </xs:simpleContent>
                        </xs:complexType>
                    </xs:element>

                    <xs:element name="date" type="notEmptyStringType" minOccurs="0" maxOccurs="1" />
                    <xs:element name="language" type="languageType" minOccurs="0" maxOccurs="1" />
                    <xs:element ref="publisher" minOccurs="0" maxOccurs="1" />
                </xs:sequence>

                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="date" type="notEmptyStringType" minOccurs="1" maxOccurs="1" />
                    <xs:element name="language" type="languageType" minOccurs="0" maxOccurs="1" />
                    <xs:element ref="publisher" minOccurs="0" maxOccurs="1" />
                </xs:sequence>

                <xs:sequence minOccurs="1" maxOccurs="1">
                    <xs:element name="language" type="languageType" minOccurs="1" maxOccurs="1" />
                    <xs:element ref="publisher" minOccurs="0" maxOccurs="1" />
                </xs:sequence>

                <xs:element ref="publisher" minOccurs="1" maxOccurs="1" />
            </xs:choice>
        </xs:complexType>
    </xs:element>

    <xs:element name="compl" type="notEmptyStringType" />

    <xs:element name="issue">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="title" minOccurs="1" maxOccurs="1">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="notEmptyStringType">
                                <xs:attribute name="type" use="required">
                                    <xs:simpleType>
                                        <xs:restriction base="xs:string">
                                            <xs:enumeration value="Rivista" />
                                            <xs:enumeration value="Collana" />
                                        </xs:restriction>
                                    </xs:simpleType>
                                </xs:attribute>

                                <xs:attribute name="alias" type="notEmptyStringType" use="required" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>

                <xs:element name="mainEnumeration" minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="notEmptyStringType">
                                <xs:attribute name="alias" type="xs:decimal" use="required" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>

                <xs:element ref="subordinateEnumeration" minOccurs="0" maxOccurs="1" />
                <xs:element name="identifierBlock" type="issueIdentifierBlockType" minOccurs="1" maxOccurs="1" />
                <xs:element ref="publicationInfo" minOccurs="0" maxOccurs="1" />
                <xs:element name="sourceBlock" type="issueSourceBlockType" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="book">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="title" type="notEmptyStringType" minOccurs="1" maxOccurs="1" />
                <xs:element ref="compl" minOccurs="0" maxOccurs="1" />

                <xs:choice minOccurs="1" maxOccurs="1">
                    <xs:element ref="issue" minOccurs="1" maxOccurs="1" />

                    <xs:sequence minOccurs="1" maxOccurs="1">
                        <xs:element name="identifierBlock" type="issueIdentifierBlockType" minOccurs="1" maxOccurs="1" />
                        <xs:element ref="publicationInfo" minOccurs="0" maxOccurs="1" />
                        <xs:element name="sourceBlock" type="issueSourceBlockType" minOccurs="0" maxOccurs="1" />
                    </xs:sequence>
                </xs:choice>

                <xs:element ref="subjectBlock" minOccurs="0" maxOccurs="1" />
                <xs:element ref="creatorBlock" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="creatorBlock" type="creatorBlockType" />

    <!--Definizione elemento radice -->
    <xs:element name="project">
        <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="1">
                <xs:element name="identifierBlock" type="projectIdentifierBlockType" minOccurs="1" maxOccurs="1" />

                <xs:element name="creator" minOccurs="1" maxOccurs="1">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="notEmptyStringType">
                                <xs:attribute name="alias" type="notEmptyStringType" use="required" />
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>

                <xs:element ref="originalTitle" minOccurs="0" maxOccurs="1" />
                <xs:element ref="assignedTitle" minOccurs="0" maxOccurs="1" />
                <xs:element ref="dateBlock" minOccurs="0" maxOccurs="1" />
                <xs:element ref="locationBlock" minOccurs="0" maxOccurs="1" />
                <xs:element name="sourceBlock" type="projectSourceBlockType" minOccurs="0" maxOccurs="1" />

                <xs:choice minOccurs="0" maxOccurs="1">
                    <xs:element name="datasetArchive" minOccurs="1" maxOccurs="1">
                        <xs:complexType>
                            <xs:sequence minOccurs="1" maxOccurs="1">
                                <xs:element ref="collection" minOccurs="1" maxOccurs="unbounded" />
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>

                    <xs:element name="datasetLibrary" minOccurs="1" maxOccurs="1">
                        <xs:complexType>
                            <xs:choice minOccurs="1" maxOccurs="unbounded">
                                <xs:element ref="issue" minOccurs="1" maxOccurs="1" />
                                <xs:element ref="book" minOccurs="1" maxOccurs="1" />

                                <xs:element name="paper" minOccurs="1" maxOccurs="1">
                                    <xs:complexType>
                                        <xs:sequence minOccurs="1" maxOccurs="1">
                                            <xs:element name="title" type="notEmptyStringType" minOccurs="1" maxOccurs="1" />
                                            <xs:element ref="compl" minOccurs="0" maxOccurs="1" />
                                            <xs:element ref="systemIdentifier" minOccurs="1" maxOccurs="1" />
                                            <xs:element ref="issue" minOccurs="1" maxOccurs="1" />
                                            <xs:element name="language" type="languageType" minOccurs="0" maxOccurs="1" />
                                            <xs:element ref="subjectBlock" minOccurs="0" maxOccurs="1" />
                                            <xs:element ref="creatorBlock" minOccurs="0" maxOccurs="1" />
                                            <xs:element name="sourceBlock" type="issueSourceBlockType" minOccurs="0" maxOccurs="1" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>

                                <xs:element name="chapter" minOccurs="1" maxOccurs="1">
                                    <xs:complexType>
                                        <xs:sequence minOccurs="1" maxOccurs="1">
                                            <xs:element name="title" type="notEmptyStringType" minOccurs="1" maxOccurs="1" />
                                            <xs:element ref="compl" minOccurs="0" maxOccurs="1" />
                                            <xs:element ref="systemIdentifier" minOccurs="1" maxOccurs="1" />
                                            <xs:element ref="book" minOccurs="1" maxOccurs="1" />
                                            <xs:element name="language" type="languageType" minOccurs="0" maxOccurs="1" />
                                            <xs:element ref="subjectBlock" minOccurs="0" maxOccurs="1" />
                                            <xs:element ref="creatorBlock" minOccurs="0" maxOccurs="1" />
                                            <xs:element name="sourceBlock" type="issueSourceBlockType" minOccurs="0" maxOccurs="1" />
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>