<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://schemas.openehr.org/v2" targetNamespace="http://schemas.openehr.org/v2" elementFormDefault="qualified"
           id="Common.xsd" version="v1.0.2">
	<!-- dependencies -->
	<xs:include schemaLocation="DataTypes.xsd"/>
    <!-- Archetyped Package -->
	<xs:complexType name="PATHABLE" abstract="true"/>
	<xs:complexType name="LOCATABLE" abstract="true">
		<xs:complexContent>
			<xs:extension base="PATHABLE">
				<xs:sequence>
					<xs:element name="name" type="DV_TEXT"/>
					<xs:element name="uid" type="UID_BASED_ID" minOccurs="0"/>
					<xs:element name="links" type="LINK" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="archetype_details" type="ARCHETYPED" minOccurs="0"/>
					<xs:element name="feeder_audit" type="FEEDER_AUDIT" minOccurs="0"/>
				</xs:sequence>
				<xs:attribute name="archetype_node_id" type="archetypeNodeId" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
    <xs:complexType name="ARCHETYPED">
        <xs:sequence>
            <xs:element name="archetype_id" type="ARCHETYPE_ID"/>
            <xs:element name="template_id" type="TEMPLATE_ID" minOccurs="0"/>
            <xs:element name="rm_version" type="NonEmptyString"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="LINK">
        <xs:sequence>
            <xs:element name="meaning" type="DV_TEXT"/>
            <xs:element name="type" type="DV_TEXT"/>
            <xs:element name="target" type="DV_EHR_URI"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="FEEDER_AUDIT">
        <xs:sequence>
            <xs:element name="originating_system_item_ids" type="DV_IDENTIFIER" minOccurs="0"
                        maxOccurs="unbounded"/>
            <xs:element name="feeder_system_item_ids" type="DV_IDENTIFIER" minOccurs="0"
                        maxOccurs="unbounded"/>
            <xs:element name="original_content" type="DV_ENCAPSULATED" minOccurs="0"/>
            <xs:element name="originating_system_audit" type="FEEDER_AUDIT_DETAILS"/>
            <xs:element name="feeder_system_audit" type="FEEDER_AUDIT_DETAILS" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="FEEDER_AUDIT_DETAILS">
        <xs:sequence>
            <xs:element name="system_id" type="NonEmptyString"/>
            <xs:element name="location" type="PARTY_IDENTIFIED" minOccurs="0"/>
            <xs:element name="provider" type="PARTY_IDENTIFIED" minOccurs="0"/>
            <xs:element name="subject" type="PARTY_PROXY" minOccurs="0"/>
            <xs:element name="time" type="DV_DATE_TIME" minOccurs="0"/>
            <xs:element name="version_id" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <!-- Generic Package -->
	<xs:complexType name="REVISION_HISTORY_ITEM">
		<xs:sequence>
			<xs:element name="version_id" type="OBJECT_VERSION_ID"/>
			<xs:element name="audits" type="AUDIT_DETAILS" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="REVISION_HISTORY">
		<xs:sequence>
			<xs:element name="items" type="REVISION_HISTORY_ITEM" minOccurs="0"
						maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="AUDIT_DETAILS">
		<xs:sequence>
			<xs:element name="system_id" type="NonEmptyString"/>
			<xs:element name="committer" type="PARTY_PROXY"/>
			<xs:element name="time_committed" type="DV_DATE_TIME"/>
			<xs:element name="change_type" type="DV_CODED_TEXT"/>
			<xs:element name="description" type="DV_TEXT" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ATTESTATION">
		<xs:complexContent>
			<xs:extension base="AUDIT_DETAILS">
				<xs:sequence>
					<xs:element name="attested_view" type="DV_MULTIMEDIA" minOccurs="0"/>
					<xs:element name="proof" type="xs:string" minOccurs="0"/>
					<xs:element name="items" type="DV_EHR_URI" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="reason" type="DV_TEXT"/>
					<xs:element name="is_pending" type="xs:boolean" default="false"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PARTY_PROXY" abstract="true">
		<xs:sequence>
			<xs:element name="external_ref" type="PARTY_REF" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="PARTY_IDENTIFIED">
		<xs:complexContent>
			<xs:extension base="PARTY_PROXY">
				<xs:sequence>
					<xs:element name="name" type="NonEmptyString" minOccurs="0"/>
					<xs:element name="identifiers" type="DV_IDENTIFIER" minOccurs="0"
								maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PARTY_RELATED">
		<xs:complexContent>
			<xs:extension base="PARTY_IDENTIFIED">
				<xs:sequence>
					<xs:element name="relationship" type="DV_CODED_TEXT"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PARTY_SELF">
		<xs:complexContent>
			<xs:extension base="PARTY_PROXY">
				<xs:sequence/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PARTICIPATION">
		<xs:sequence>
			<xs:element name="function" type="DV_TEXT"/>
			<xs:element name="performer" type="PARTY_PROXY"/>
			<xs:element name="time" type="DV_INTERVAL" minOccurs="0"/>
			<xs:element name="mode" type="DV_CODED_TEXT"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Change Control Package -->
    <xs:complexType name="VERSION" abstract="true">
		<xs:sequence>
			<xs:element name="contribution" type="OBJECT_REF"/>
			<xs:element name="commit_audit" type="AUDIT_DETAILS"/>
			<xs:element name="signature" type="xs:string" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ORIGINAL_VERSION">
		<xs:complexContent>
			<xs:extension base="VERSION">
				<xs:sequence>
					<xs:element name="uid" type="OBJECT_VERSION_ID"/>
					<xs:element name="data" type="xs:anyType" minOccurs="0"/>
					<xs:element name="preceding_version_uid" type="OBJECT_VERSION_ID" minOccurs="0"/>
					<xs:element name="other_input_version_uids" type="OBJECT_VERSION_ID"
						minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="attestations" type="ATTESTATION" minOccurs="0"
						maxOccurs="unbounded"/>
					<xs:element name="lifecycle_state" type="DV_CODED_TEXT"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="IMPORTED_VERSION">
		<xs:complexContent>
			<xs:extension base="VERSION">
				<xs:sequence>
					<xs:element name="item" type="ORIGINAL_VERSION"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="VERSIONED_OBJECT">
		<xs:annotation>
			<xs:documentation>Version control abstraction, defining semantics for versioning one complex object.</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name="uid" type="HIER_OBJECT_ID"/>
			<xs:element name="owner_id" type="OBJECT_REF"/>
			<xs:element name="time_created" type="DV_DATE_TIME"/>
			<xs:element name="versions" type="VERSION" minOccurs="0" maxOccurs="unbounded">
				<xs:annotation>
					<xs:documentation>An ordered list of VERSIONs</xs:documentation>
				</xs:annotation>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
    <xs:complexType name="CONTRIBUTION">
        <xs:sequence>
            <xs:element name="uid" type="HIER_OBJECT_ID"/>
            <xs:element name="versions" type="OBJECT_REF" maxOccurs="unbounded"/>
            <xs:element name="audit" type="AUDIT_DETAILS"/>
        </xs:sequence>
    </xs:complexType>
    <!-- Directory Package -->
	<xs:complexType name="VERSIONED_FOLDER">
		<xs:complexContent>
			<xs:extension base="VERSIONED_OBJECT"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="FOLDER">
		<xs:complexContent>
			<xs:extension base="LOCATABLE">
				<xs:sequence>
					<xs:element name="folders" type="FOLDER" minOccurs="0" maxOccurs="unbounded"/>
					<xs:element name="items" type="OBJECT_REF" minOccurs="0" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

</xs:schema>
