<?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/frad/1.1/other"
            targetNamespace="http://vfrbr.info/frad/1.1/other"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified"
            >

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

  <xsd:element name="hasHierarchy"
               type="HasHierarchyType"
               />

  <xsd:element name="hasEquivalent"
               type="HasEquivalentType"
               />

  <xsd:element name="hasDerivative"
               type="HasDerivativeType"
               />

  <xsd:element name="hasDescriptive"
               type="HasDescriptiveType"
               />

  <xsd:element name="hasSequence"
               type="HasSequenceType"
               />

  <xsd:element name="hasSharedCharacteristic"
               type="HasSharedCharacteristicType"
               />

  <xsd:element name="hasPseudonym"
               type="HasPseudonymType"
               />

  <xsd:element name="hasSecularName"
               type="HasSecularNameType"
               />

  <xsd:element name="hasReligionName"
               type="HasReligionNameType"
               />

  <xsd:element name="hasOfficialName"
               type="HasOfficialNameType"
               />

  <xsd:element name="hasAttribution"
               type="HasAttributionType"
               />

  <xsd:element name="hasCollaboration"
               type="HasCollaborationType"
               />

  <xsd:element name="hasSibling"
               type="HasSiblingType"
               />

  <xsd:element name="hasChild"
               type="HasChildType"
               />

  <xsd:element name="hasMember"
               type="HasMemberType"
               />

  <xsd:element name="hasDescendent"
               type="HasDescendentType"
               />

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

  <!--
    type for hasHierarchy
    -->
  <xsd:complexType name="HasHierarchyType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="corporateBody"/>
        </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="corporateBody"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

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

  </xsd:complexType>

  <!--
    type for hasEquivalent
    -->
  <xsd:complexType name="HasEquivalentType">
    <xsd:complexContent>
      <xsd:extension base="WorkHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasDerivative
    -->
  <xsd:complexType name="HasDerivativeType">
    <xsd:complexContent>
      <xsd:extension base="WorkHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasDescriptive
    -->
  <xsd:complexType name="HasDescriptiveType">
    <xsd:complexContent>
      <xsd:extension base="WorkHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasSequence
    -->
  <xsd:complexType name="HasSequenceType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="work"/>
          <xsd:enumeration value="corporateBody"/>
        </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="corporateBody"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

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

  </xsd:complexType>

  <!--
    type for hasSharedCharacteristic
    -->
  <xsd:complexType name="HasSharedCharacteristicType">
    <xsd:complexContent>
      <xsd:extension base="WorkHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasPseudonym
    -->
  <xsd:complexType name="HasPseudonymType">
    <xsd:complexContent>
      <xsd:extension base="PersonHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasSecularName
    -->
  <xsd:complexType name="HasSecularNameType">
    <xsd:complexContent>
      <xsd:extension base="PersonHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasReligionName
    -->
  <xsd:complexType name="HasReligionNameType">
    <xsd:complexContent>
      <xsd:extension base="PersonHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasOfficialName
    -->
  <xsd:complexType name="HasOfficialNameType">
    <xsd:complexContent>
      <xsd:extension base="PersonHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasAttribution
    -->
  <xsd:complexType name="HasAttributionType">
    <xsd:complexContent>
      <xsd:extension base="PersonHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasCollaboration
    -->
  <xsd:complexType name="HasCollaborationType">
    <xsd:complexContent>
      <xsd:extension base="PersonHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasSibling
    -->
  <xsd:complexType name="HasSiblingType">
    <xsd:complexContent>
      <xsd:extension base="PersonHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasChild
    -->
  <xsd:complexType name="HasChildType">
    <xsd:complexContent>
      <xsd:extension base="PersonHasType"/>
    </xsd:complexContent>
  </xsd:complexType>

  <!--
    type for hasMember
    -->
  <xsd:complexType name="HasMemberType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="family"/>
        </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="person"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

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

  </xsd:complexType>

  <!--
    type for hasDescendent
    -->
  <xsd:complexType name="HasDescendentType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="family"/>
        </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="family"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

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

  </xsd:complexType>

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

  <!--
    type for work to work has relations
    -->

  <xsd:complexType name="WorkHasType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="work"/>
        </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:restriction>
      </xsd:simpleType>
    </xsd:attribute>

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

  </xsd:complexType>

  <!--
    type for corporateBody to corporateBody has relations
    -->

  <xsd:complexType name="CorporateBodyHasType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="corporateBody"/>
        </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="corporateBody"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

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

  </xsd:complexType>

  <!--
    type for person to person has relations
    -->

  <xsd:complexType name="PersonHasType">

    <xsd:attribute name="sourceEntity"
                   use="required">
      <xsd:simpleType>
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="person"/>
        </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="person"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:attribute>

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

  </xsd:complexType>

</xsd:schema>
