<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	       elementFormDefault="qualified"
	       targetNamespace="http://www.leiroc.org/data/schema/leidata/2014"
	       xmlns:lei="http://www.leiroc.org/data/schema/leidata/2014">

  <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/>

  <xs:element name="LEIData" type="lei:LEIData" />

  <xs:complexType name="LEIData">
    <xs:sequence>
      <xs:element name="LEIHeader" type="lei:LEIHeaderType" minOccurs="0"/>
      <xs:element name="LEIRecords" type="lei:LEIRecordsType"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="LEIHeaderType">
    <xs:sequence>
       <xs:element name="ContentDate" type="xs:dateTime" minOccurs="0"/>
       <xs:element name="Originator" type="lei:LEIType" minOccurs="0"/>
       <xs:element name="FileContent" type="lei:FileContentEnum" minOccurs="0"/>
       <xs:element name="DeltaStart" type="xs:dateTime" minOccurs="0"/>
       <xs:element name="RecordCount" type="xs:int" minOccurs="0"/>
       <xs:element name="NextVersion" type="lei:HeaderNextVersionType" minOccurs="0"/>
       <xs:element name="Extension" type="lei:ExtensionType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="HeaderNextVersionType">
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" namespace="##targetNamespace"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="LEIRecordsType">
    <xs:sequence>
      <xs:element name="LEIRecord" type="lei:LEIRecordType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="LEIRecordType" >
      <xs:sequence>
        <xs:element name="LEI" type="lei:LEIType"/>
        <xs:element name="Entity" type="lei:EntityType"/>
        <xs:element name="Registration" type="lei:RegistrationType"/>
        <xs:element name="NextVersion" type="lei:LEIRecordNextVersionType" minOccurs="0"/>
        <xs:element name="Extension" type="lei:ExtensionType" minOccurs="0"/>
      </xs:sequence>
  </xs:complexType>

  <xs:complexType name="LEIRecordNextVersionType">
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" namespace="##targetNamespace"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="EntityType" >
      <xs:sequence>
        <xs:element name="LegalName" type="lei:NameType"/>
        <xs:element name="OtherEntityNames" type="lei:OtherEntityNamesType" minOccurs="0"/>
        <xs:element name="LegalAddress" type="lei:AddressType"/>
        <xs:element name="HeadquartersAddress" type="lei:AddressType"/>
        <xs:element name="OtherAddresses" type="lei:OtherAddressesType" minOccurs="0"/>
        <xs:element name="BusinessRegisterEntityID" type="lei:BusinessRegisterEntityIDType" minOccurs="0"/>
        <xs:element name="LegalJurisdiction" type="lei:JurisdictionCodeType" minOccurs="0"/>
        <xs:element name="LegalForm" type="lei:NameType" minOccurs="0"/>
        <xs:element name="AssociatedEntity" type="lei:AssociatedEntityType" minOccurs="0"/>
        <xs:element name="EntityStatus" type="lei:EntityStatusEnum"/>
        <xs:element name="EntityExpirationDate" type="xs:dateTime" minOccurs="0"/>
        <xs:element name="EntityExpirationReason" type="lei:EntityExpirationReasonEnum" minOccurs="0"/>
        <xs:element name="SuccessorEntity" type="lei:SuccessorEntityType" minOccurs="0"/>
        <xs:element name="NextVersion" type="lei:EntityNextVersionType" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>

  <xs:complexType name="EntityNextVersionType">
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" namespace="##targetNamespace"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="RegistrationType" >
      <xs:sequence>
        <xs:element name="InitialRegistrationDate" type="xs:dateTime"/>
        <xs:element name="LastUpdateDate" type="xs:dateTime"/>
        <xs:element name="RegistrationStatus" type="lei:RegistrationStatusEnum"/>
        <xs:element name="NextRenewalDate" type="xs:dateTime" />
        <xs:element name="ManagingLOU" type="lei:LEIType"/>
        <xs:element name="ValidationSources" type="lei:ValidationSourcesEnum" minOccurs="0"/>
        <xs:element name="NextVersion" type="lei:RegistrationNextVersionType" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>

    <xs:complexType name="RegistrationNextVersionType">
      <xs:sequence>
        <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" namespace="##targetNamespace"/>
      </xs:sequence>
    </xs:complexType>

    <xs:complexType name="ExtensionType">
      <xs:sequence>
        <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" namespace="##other"/>
      </xs:sequence>
    </xs:complexType>

    <xs:complexType name="AddressType">
      <xs:sequence>
        <xs:element name="Line1" type="lei:Token500Type"/>
        <xs:element name="Line2" type="lei:Token500Type" minOccurs="0"/>
        <xs:element name="Line3" type="lei:Token500Type" minOccurs="0"/>
        <xs:element name="Line4" type="lei:Token500Type" minOccurs="0"/>
        <xs:element name="City"  type="lei:Token500Type" />
        <xs:element name="Region"  type="lei:RegionCodeType" minOccurs="0"/>
        <xs:element name="Country"  type="lei:CountryCodeType" />
        <xs:element name="PostalCode"  type="lei:Token500Type" minOccurs="0"/>
	  </xs:sequence>
	  <xs:attribute ref="xml:lang" use="optional"/>
	</xs:complexType>

    <xs:complexType name="AssociatedEntityType">
      <xs:choice>
        <xs:element name="AssociatedLEI" type="lei:LEIType"/>
        <xs:element name="AssociatedEntityName" type="lei:NameType"/>
      </xs:choice>
      <xs:attribute name="type" type="lei:AssociatedEntityTypeEnum" use="required"/>
    </xs:complexType>

  <xs:complexType name="BusinessRegisterEntityIDType">
    	<xs:simpleContent>
	      <xs:extension base="lei:Token500Type">
	        <xs:attribute name="register" type="lei:BusinessRegisterEnum"/>
	      </xs:extension>
    	</xs:simpleContent>
    </xs:complexType>

    <xs:simpleType name="JurisdictionCodeType">
      <xs:union memberTypes="lei:CountryCodeType lei:RegionCodeType" />
    </xs:simpleType>

  <xs:complexType name="NameType">
    	<xs:simpleContent>
	      <xs:extension base="lei:Token500Type">
	        <xs:attribute ref="xml:lang" use="optional"/>
	      </xs:extension>
    	</xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="OtherAddressType">
	    <xs:complexContent>
	      <xs:extension base="lei:AddressType">
	        <xs:attribute name="type" type="lei:AddressTypeEnum" use="required"/>
	      </xs:extension>
	    </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="OtherAddressesType">
      <xs:sequence>
        <xs:element name="OtherAddress" type="lei:OtherAddressType" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>


    <xs:complexType name="OtherEntityNamesType">
      <xs:sequence>
        <xs:element name="OtherEntityName" type="lei:OtherEntityNameType" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>

  <xs:complexType name="OtherEntityNameType">
    <xs:complexContent>
	  <xs:extension base="lei:NameType">
	    <xs:attribute name="type" type="lei:EntityNameTypeEnum" use="required"/>
	  </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="SuccessorEntityType">
    <xs:choice>
      <xs:element name="SuccessorLEI" type="lei:LEIType"/>
      <xs:element name="SuccessorEntityName" type="lei:NameType"/>
    </xs:choice>
  </xs:complexType>



 <xs:simpleType name="CountryCodeType">
    <xs:restriction base="xs:string">
      <xs:minLength value="2"/>
      <xs:maxLength value="2"/>
      <xs:pattern value="([A-Z]{2})"/>
    </xs:restriction>
  </xs:simpleType>

 <xs:simpleType name="RegionCodeType">
    <xs:restriction base="xs:string">
      <xs:minLength value="4"/>
      <xs:maxLength value="6"/>
      <xs:pattern value="([A-Z]{2}-[A-Z0-9]{1,3})"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="LEIType">
    <xs:restriction base="xs:string">
      <xs:minLength value="20"/>
      <xs:maxLength value="20"/>
      <xs:pattern value="([0-9A-Z]{18}[0-9]{2})"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="Token500Type">
    <xs:restriction base="xs:token">
      <xs:maxLength value="500"/>
    </xs:restriction>
  </xs:simpleType>

  <!--
     All enumeration types provide for forward compatibility by accepting any string as valid at the schema level.
     The legal values for Version 1.0 are indicated in a 1.0-suffixed type which is unioned with xs:string to
     form the complete enumeration type.
  -->

  <xs:simpleType name="FileContentEnum1.0">
    <xs:restriction base="xs:string">
       <!-- Enumeration values for 1.0: -->
       <xs:enumeration value="LOU_FULL_PUBLISHED" />
       <xs:enumeration value="LOU_DELTA_PUBLISHED" />
       <xs:enumeration value="COU_FULL_PUBLISHED" />
       <xs:enumeration value="COU_DELTA_PUBLISHED" />
       <xs:enumeration value="QUERY_RESPONSE" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="FileContentEnum">
    <xs:union memberTypes="lei:FileContentEnum1.0 xs:string" />
  </xs:simpleType>

  <xs:simpleType name="BusinessRegisterEnum">
    <xs:restriction base="xs:string">
      <xs:annotation>
        <xs:documentation>
           <!-- Enumeration values for 1.0 are maintained elsewhere -->
        </xs:documentation>
      </xs:annotation>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="EntityNameTypeEnum1.0">
    <xs:restriction base="xs:string">
       <!-- Enumeration values for 1.0: -->
       <xs:enumeration value="OTHER_LEGAL" />
       <xs:enumeration value="PREFERRED_ASCII_TRANSLITERATED_LEGAL" />
       <xs:enumeration value="AUTO_ASCII_TRANSLITERATED_LEGAL" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="EntityNameTypeEnum">
    <xs:union memberTypes="lei:EntityNameTypeEnum1.0 xs:string" />
  </xs:simpleType>

  <xs:simpleType name="AddressTypeEnum1.0">
    <xs:restriction base="xs:string">
       <!-- Enumeration values for 1.0: -->
       <xs:enumeration value="LEGAL_ADDRESS" />
       <xs:enumeration value="HEADQUARTERS_ADDRESS" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="AddressTypeEnum">
    <xs:union memberTypes="lei:AddressTypeEnum1.0 xs:string" />
  </xs:simpleType>

  <xs:simpleType name="AssociatedEntityTypeEnum1.0">
    <xs:restriction base="xs:string">
       <!-- Enumeration values for 1.0: -->
       <xs:enumeration value="FUND_FAMILY" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="AssociatedEntityTypeEnum">
    <xs:union memberTypes="lei:AssociatedEntityTypeEnum1.0 xs:string" />
  </xs:simpleType>

  <xs:simpleType name="EntityStatusEnum1.0">
    <xs:restriction base="xs:string">
       <!-- Enumeration values for 1.0: -->
       <xs:enumeration value="ACTIVE" />
       <xs:enumeration value="INACTIVE" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="EntityStatusEnum">
    <xs:union memberTypes="lei:EntityStatusEnum1.0 xs:string" />
  </xs:simpleType>

  <xs:simpleType name="EntityExpirationReasonEnum1.0">
    <xs:restriction base="xs:string">
       <!-- Enumeration values for 1.0: -->
       <xs:enumeration value="DISSOLVED" />
       <xs:enumeration value="CORPORATE_ACTION" />
       <xs:enumeration value="OTHER" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="EntityExpirationReasonEnum">
    <xs:union memberTypes="lei:EntityExpirationReasonEnum1.0 xs:string" />
  </xs:simpleType>

  <xs:simpleType name="RegistrationStatusEnum1.0">
    <xs:restriction base="xs:string">
       <!-- Enumeration values for 1.0: -->
       <xs:enumeration value="PENDING_VALIDATION" />
       <xs:enumeration value="ISSUED" />
       <xs:enumeration value="DUPLICATE" />
       <xs:enumeration value="LAPSED" />
       <xs:enumeration value="MERGED" />
       <xs:enumeration value="RETIRED" />
       <xs:enumeration value="ANNULLED" />
       <xs:enumeration value="CANCELLED" />
       <xs:enumeration value="TRANSFERRED" />
       <xs:enumeration value="PENDING_TRANSFER" />
       <xs:enumeration value="PENDING_ARCHIVAL" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="RegistrationStatusEnum">
    <xs:union memberTypes="lei:RegistrationStatusEnum1.0 xs:string" />
  </xs:simpleType>

  <xs:simpleType name="ValidationSourcesEnum1.0">
    <xs:restriction base="xs:string">
       <!-- Enumeration values for 1.0: -->
       <xs:enumeration value="PENDING" />
       <xs:enumeration value="ENTITY_SUPPLIED_ONLY" />
       <xs:enumeration value="PARTIALLY_CORROBORATED" />
       <xs:enumeration value="FULLY_CORROBORATED" />
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="ValidationSourcesEnum">
    <xs:union memberTypes="lei:ValidationSourcesEnum1.0 xs:string" />
  </xs:simpleType>

</xs:schema>
