<?xml version="1.0" encoding="UTF-8"?>

<!--
  Variations/FRBR Project schema release 1.1
-->

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"

            xmlns="http://vfrbr.info/frbr/1.1/other"
            targetNamespace="http://vfrbr.info/frbr/1.1/other"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified"
            >

  <!--
    XML element definitions
    for the FRBR Other relationshipTypes
    -->

  <xsd:element name="hasPart"
               type="HasPartType"
               />

  <xsd:element name="hasSuccessor"
               type="HasSuccessorType"
               />

  <xsd:element name="hasSupplement"
               type="HasSupplementType"
               />

  <xsd:element name="hasComplement"
               type="HasComplementType"
               />

  <xsd:element name="hasSummary"
               type="HasSummaryType"
               />

  <xsd:element name="hasAdaptation"
               type="HasAdaptationType"
               />

  <xsd:element name="hasTransformation"
               type="HasTransformationType"
               />

  <xsd:element name="hasImitation"
               type="HasImitationType"
               />

  <xsd:element name="hasAbridgement"
               type="HasAbridgementType"
               />

  <xsd:element name="hasRevision"
               type="HasRevisionType"
               />

  <xsd:element name="hasTranslation"
               type="HasTranslationType"
               />

  <xsd:element name="hasArrangement"
               type="HasArrangementType"
               />

  <xsd:element name="hasReproduction"
               type="HasReproductionType"
               />

  <xsd:element name="hasAlternate"
               type="HasAlternateType"
               />

  <xsd:element name="hasReconfiguration"
               type="HasReconfigurationType"
               />

  <!--
    ============ type definitions for elements ============
    -->

  <!--
    type for hasPart
    -->
  <xsd:complexType name="HasPartType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="work"/>
          <xsd:enumeration value="expression"/>
          <xsd:enumeration value="manifestation"/>
          <xsd:enumeration value="item"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="sourceURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="targetEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="work"/>
          <xsd:enumeration value="expression"/>
          <xsd:enumeration value="manifestation"/>
          <xsd:enumeration value="item"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="targetURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="category"
                   use="optional">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="dependent"/>
          <xsd:enumeration value="independent"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

  </xsd:complexType>

  <!--
    type for hasSuccesor
    -->
  <xsd:complexType name="HasSuccessorType">
    <xsd:complexContent>
      <xsd:extension base="ReferentialHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasSupplement
    -->
  <xsd:complexType name="HasSupplementType">
    <xsd:complexContent>
      <xsd:extension base="ReferentialHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasComplement
    -->
  <xsd:complexType name="HasComplementType">
    <xsd:complexContent>
      <xsd:extension base="ReferentialHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasSummary
    -->
  <xsd:complexType name="HasSummaryType">
    <xsd:complexContent>
      <xsd:extension base="AutonomousHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasAdaptation
    -->
  <xsd:complexType name="HasAdaptationType">
    <xsd:complexContent>
      <xsd:extension base="AutonomousHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasTransformation
    -->
  <xsd:complexType name="HasTransformationType">
    <xsd:complexContent>
      <xsd:extension base="AutonomousHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasImitation
    -->
  <xsd:complexType name="HasImitationType">
    <xsd:complexContent>
      <xsd:extension base="AutonomousHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasAbridgement
    -->
  <xsd:complexType name="HasAbridgementType">
    <xsd:complexContent>
      <xsd:extension base="ExpressionHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasRevision
    -->
  <xsd:complexType name="HasRevisionType">
    <xsd:complexContent>
      <xsd:extension base="ExpressionHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasTranslation
    -->
  <xsd:complexType name="HasTranslationType">
    <xsd:complexContent>
      <xsd:extension base="ExpressionHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasArrangement
    -->
  <xsd:complexType name="HasArrangementType">
    <xsd:complexContent>
      <xsd:extension base="ExpressionHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasReproduction
    -->

  <xsd:complexType name="HasReproductionType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="manifestation"/>
          <xsd:enumeration value="item"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="sourceURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="targetEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="manifestation"/>
          <xsd:enumeration value="item"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="targetURI"
                   type="xsd:anyURI"
                   use="required"/>

  </xsd:complexType>

  <!--
    type for hasAlternated
    -->

  <xsd:complexType name="HasAlternateType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="nanifestation"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="sourceURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="targetEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="manifestation"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="targetURI"
                   type="xsd:anyURI"
                   use="required"/>

  </xsd:complexType>

  <!--
    type for hasReconfiguration
    -->

  <xsd:complexType name="HasReconfigurationType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="item"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="sourceURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="targetEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="item"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="targetURI"
                   type="xsd:anyURI"
                   use="required"/>

  </xsd:complexType>

  <!--
    ============ reused common types ============
    -->

  <!--
    type for referential and autonomous has types
    of work and expression
    -->
  <xsd:complexType name="ReferentialHasType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="work"/>
          <xsd:enumeration value="expression"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="sourceURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="targetEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="work"/>
          <xsd:enumeration value="expression"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="targetURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="category"
                   use="optional">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="autonomous"/>
          <xsd:enumeration value="referential"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

  </xsd:complexType>

  <!--
    type for autonomous has types
    of work and expression
    -->
  <xsd:complexType name="AutonomousHasType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="work"/>
          <xsd:enumeration value="expression"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="sourceURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="targetEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="work"/>
          <xsd:enumeration value="expression"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="targetURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="category"
                   use="optional">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="autonomous"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

  </xsd:complexType>

  <!--
    type for autonomous has types
    of expression and expression
    -->

  <xsd:complexType name="ExpressionHasType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="expression"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="sourceURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="targetEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="expression"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

    <xsd:attribute name="targetURI"
                   type="xsd:anyURI"
                   use="required"/>

    <xsd:attribute name="category"
                   use="optional">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="autonomous"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

  </xsd:complexType>

</xsd:schema>
