<?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="BaseTypes.xsd" version="v1.2.0">
	<xs:simpleType name="Iso8601DateTime">
		<xs:restriction base="xs:string">
			<xs:pattern
				value="\d{4}((0[1-9]|1[0-2])((0[1-9]|[12]\d|3[01])(T([01]\d|2[0-3])([0-5]\d([0-5]\d([,.]\d+)?)?)?(Z|([+\-](0\d|1[0-4])(00|30|45)?))?)?)?)?|\d{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12]\d|3[01])(T([01]\d|2[0-3])(:[0-5]\d(:[0-5]\d([,.]\d+)?)?)?(Z|([+\-](0\d|1[0-4])(:(00|30|45))?))?)?)?)?"
			/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Iso8601Date">
		<xs:restriction base="xs:string">
			<xs:pattern
				value="\d{4}((0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])?|-(0[1-9]|1[0-2])(-(0[1-9]|[12]\d|3[01]))?)?"
			/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Iso8601Time">
		<xs:restriction base="xs:string">
			<xs:pattern
				value="([01]\d|2[0-3])([0-5]\d([0-5]\d([,.]\d+)?)?)?(Z|([+\-](0\d|1[0-4])(00|30|45)?))?|([01]\d|2[0-3])(:[0-5]\d(:[0-5]\d([,.]\d+)?)?)?(Z|([+\-](0\d|1[0-4])(:(00|30|45))?))?"
			/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Iso8601Duration">
		<xs:restriction base="xs:string">
			<xs:pattern value="P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?(T(\d+H)?(\d+M)?(\d+(\.\d+)?S)?)?"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="matchString">
		<xs:restriction base="xs:string">
			<xs:pattern value="\?"/>
			<xs:pattern value="&lt;"/>
			<xs:pattern value="&gt;"/>
			<xs:pattern value="="/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="magnitudeStatus">
		<xs:restriction base="xs:string">
			<xs:pattern value="="/>
			<xs:pattern value="&lt;"/>
			<xs:pattern value="&lt;="/>
			<xs:pattern value="&gt;"/>
			<xs:pattern value="&gt;="/>
			<xs:pattern value="~"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="archetypeNodeId">
		<xs:restriction base="xs:string">
			<!-- this considers also ARCHETYPE_HRID namespaces and also id-codes
			see https://regex101.com/r/IX5KjF/8
			-->
			<xs:pattern	value="((?:(?:\w+(?:\.[\w-]+)+::)?(?:[a-zA-Z]\w+)-(?:[a-zA-Z]\w+)-(?:[a-zA-Z]\w+)\.(?:[a-zA-Z]\w+(?:-\w+)?)\.v\d+(?:\.\d+\.\d+)?(?:-(?:rc|alpha)(?:\.\d+)?)?)|(?:(?:at|id)\d+(?:\.\d+)*))"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="NonEmptyString">
		<xs:restriction base="xs:string">
			<xs:minLength value="1"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="NonEmptyToken">
		<xs:restriction base="xs:token">
			<xs:minLength value="1"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="NonEmptyUri">
		<xs:restriction base="xs:anyURI">
			<xs:minLength value="1"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="StringDictionaryItem">
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="id" type="xs:string" use="required"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
    <xs:complexType name="UID" abstract="true">
        <xs:sequence>
            <xs:element name="value" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="UUID">
        <xs:complexContent>
            <xs:extension base="UID"/>
        </xs:complexContent>
    </xs:complexType>
	<xs:complexType name="OBJECT_ID" abstract="true">
		<xs:sequence>
			<xs:element name="value" type="NonEmptyToken"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="UID_BASED_ID" abstract="true">
		<xs:complexContent>
			<xs:extension base="OBJECT_ID">
				<xs:sequence/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="OBJECT_VERSION_ID">
		<xs:complexContent>
			<xs:extension base="UID_BASED_ID"/>
		</xs:complexContent>
	</xs:complexType>
    <xs:complexType name="VERSION_TREE_ID">
        <xs:sequence>
            <xs:element name="value" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
	<xs:complexType name="ARCHETYPE_ID">
		<xs:complexContent>
			<xs:extension base="OBJECT_ID"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="TEMPLATE_ID">
		<xs:complexContent>
			<xs:extension base="OBJECT_ID"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="TERMINOLOGY_ID">
		<xs:complexContent>
			<xs:extension base="OBJECT_ID"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="HIER_OBJECT_ID">
		<xs:complexContent>
			<xs:extension base="UID_BASED_ID"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="GENERIC_ID">
		<xs:complexContent>
			<xs:extension base="OBJECT_ID">
				<xs:sequence>
					<xs:element name="scheme" type="xs:string"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="OBJECT_REF">
		<xs:sequence>
			<xs:element name="id" type="OBJECT_ID"/>
			<xs:element name="namespace" type="NonEmptyToken"/>
			<xs:element name="type" type="NonEmptyToken"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="PARTY_REF">
		<xs:complexContent>
			<xs:extension base="OBJECT_REF"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="ACCESS_GROUP_REF">
		<xs:complexContent>
			<xs:extension base="OBJECT_REF"/>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="ACCESS_CONTROL_SETTINGS" abstract="true">
	</xs:complexType>
	<xs:complexType name="LOCATABLE_REF">
		<xs:complexContent>
			<xs:extension base="OBJECT_REF">
				<xs:sequence>
					<xs:element name="path" type="xs:string" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="Interval" abstract="true">
		<xs:sequence>
			<xs:element name="lower_included" type="xs:boolean" minOccurs="0"/>
			<xs:element name="upper_included" type="xs:boolean" minOccurs="0"/>
			<xs:element name="lower_unbounded" type="xs:boolean"/>
			<xs:element name="upper_unbounded" type="xs:boolean"/>
		</xs:sequence>
	</xs:complexType>

	<xs:complexType name="IntervalOfInteger">
		<xs:complexContent>
			<xs:extension base="Interval">
				<xs:sequence>
					<xs:element name="lower" type="xs:int" minOccurs="0"/>
					<xs:element name="upper" type="xs:int" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="MultiplicityInterval">
		<xs:complexContent>
			<xs:extension base="IntervalOfInteger">
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="IntervalOfReal">
		<xs:complexContent>
			<xs:extension base="Interval">
				<xs:sequence>
					<xs:element name="lower" type="xs:float" minOccurs="0"/>
					<xs:element name="upper" type="xs:float" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="IntervalOfDate">
		<xs:complexContent>
			<xs:extension base="Interval">
				<xs:sequence>
					<xs:element name="lower" type="Iso8601Date" minOccurs="0"/>
					<xs:element name="upper" type="Iso8601Date" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="IntervalOfDateTime">
		<xs:complexContent>
			<xs:extension base="Interval">
				<xs:sequence>
					<xs:element name="lower" type="Iso8601DateTime" minOccurs="0"/>
					<xs:element name="upper" type="Iso8601DateTime" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="IntervalOfTime">
		<xs:complexContent>
			<xs:extension base="Interval">
				<xs:sequence>
					<xs:element name="lower" type="Iso8601Time" minOccurs="0"/>
					<xs:element name="upper" type="Iso8601Time" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="IntervalOfDuration">
		<xs:complexContent>
			<xs:extension base="Interval">
				<xs:sequence>
					<xs:element name="lower" type="Iso8601Duration" minOccurs="0"/>
					<xs:element name="upper" type="Iso8601Duration" minOccurs="0"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>

	<xs:complexType name="TERMINOLOGY_CODE">
		<xs:sequence>
			<xs:element name="terminology_id" type="xs:string"/>
			<xs:element name="code_string" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>

	<xs:simpleType name="VALIDITY_KIND">
		<xs:restriction base="xs:string">
			<xs:enumeration value="mandatory"/>
			<xs:enumeration value="optional"/>
			<xs:enumeration value="prohibited"/>
		</xs:restriction>
	</xs:simpleType>

</xs:schema>
