<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:pef="http://www.kpi.kharkov.ua/pef" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.kpi.kharkov.ua/pef" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- Content structure -->
	<xs:element name="predesign_model">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="model_info" type="pef:ModelInfo"/>
				<xs:element name="requirements_library" type="pef:ReqLibrary"/>
				<xs:element name="thingtype_list" type="pef:ThingTypeList"/>
				<xs:element name="opertype_list" type="pef:OperationTypeList"/>
				<xs:element name="conntype_list" type="pef:ConnectionTypeList"/>
			</xs:sequence>
		</xs:complexType>
		<!-- Integrity constraints -->
		<xs:key name="reqtext_key">
			<xs:selector xpath="pef:requirements_library/pef:reqtext"/>
			<xs:field xpath="pef:reqtext_id"/>
		</xs:key>
		<xs:key name="sentence_key">
			<xs:selector xpath="pef:requirements_library/pef:reqtext/pef:sentence_list/pef:sentence"/>
			<xs:field xpath="pef:sentence_id"/>
		</xs:key>
		<xs:key name="thingtype_key">
			<xs:selector xpath="pef:thingtype_list/pef:thingtype"/>
			<xs:field xpath="pef:thingtype_id"/>
		</xs:key>
		<xs:key name="opertype_key">
			<xs:selector xpath="pef:opertype_list/pef:opertype"/>
			<xs:field xpath="pef:opertype_id"/>
		</xs:key>
		<xs:key name="conntype_key">
			<xs:selector xpath="pef:conntype_list/pef:conntype"/>
			<xs:field xpath="pef:conntype_id"/>
		</xs:key>
		<xs:keyref name="thingtype_reqref" refer="pef:sentence_key">
			<xs:selector xpath="pef:thingtype_list/pef:thingtype/pef:requirement_source/pef:source"/>
			<xs:field xpath="pef:source_id"/>
		</xs:keyref>
		<xs:keyref name="opertype_reqref" refer="pef:sentence_key">
			<xs:selector xpath="pef:opertype_list/pef:opertype/pef:requirement_source/pef:source"/>
			<xs:field xpath="pef:source_id"/>
		</xs:keyref>
		<xs:keyref name="conntype_reqref" refer="pef:sentence_key">
			<xs:selector xpath="pef:conntype_list/pef:conntype/pef:requirement_source/pef:source"/>
			<xs:field xpath="pef:source_id"/>
		</xs:keyref>
		<xs:keyref name="executing_ref" refer="pef:thingtype_key">
			<xs:selector xpath="pef:opertype_list/pef:opertype"/>
			<xs:field xpath="pef:executing"/>
		</xs:keyref>
	</xs:element>
	<!-- Model Information -->
	<xs:simpleType name="mid">
		<xs:restriction base="xs:string">
			<xs:pattern value="M\d+"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="ModelInfo">
		<xs:sequence>
			<xs:element name="model_id" type="pef:mid"/>
			<xs:element name="model_description" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Requirement sources -->
	<!-- Requirement text ID -->
	<xs:simpleType name="tid">
		<xs:restriction base="xs:string">
			<xs:pattern value="T\d+"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Requirement text -->
	<xs:complexType name="ReqText">
		<xs:sequence>
			<xs:element name="reqtext_id" type="pef:tid"/>
			<xs:element name="title" type="xs:string"/>
			<xs:element name="sentence_list">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="sentence" type="pef:ReqSentence" maxOccurs="unbounded"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<!-- Requirement library -->
	<xs:complexType name="ReqLibrary">
		<xs:sequence>
			<xs:element name="reqtext" type="pef:ReqText" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Requirement sentence ID -->
	<xs:simpleType name="sid">
		<xs:restriction base="xs:string">
			<xs:pattern value="S\d+"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Requirement sentence -->
	<xs:complexType name="ReqSentence">
		<xs:sequence>
			<xs:element name="sentence_id" type="pef:sid"/>
			<xs:element name="sentence_text" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Requirement sentence ID list (for glossaries) -->
	<xs:complexType name="ReqSourceType">
		<xs:sequence>
			<xs:element name="source" maxOccurs="unbounded">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="source_id" type="pef:sid"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<!-- ***********************************-->
	<!-- Thing-type related definitions -->
	<!-- ***********************************-->
	<!-- Thing-type ID -->
	<xs:simpleType name="did">
		<xs:restriction base="xs:string">
			<xs:pattern value="D\d+"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Classification of thing-types -->
	<xs:simpleType name="ThingTypeClassification">
		<xs:restriction base="xs:string">
			<xs:enumeration value="thing-type"/>
			<xs:enumeration value="concern"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Thing-type -->
	<xs:complexType name="ThingType">
		<xs:sequence>
			<xs:element name="thingtype_id" type="pef:did"/>
			<xs:element name="thingtype_name" type="xs:string"/>
			<xs:element name="classification" type="pef:ThingTypeClassification"/>
			<xs:element name="requirement_source" type="pef:ReqSourceType"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Thing-type list -->
	<xs:complexType name="ThingTypeList">
		<xs:sequence>
			<xs:element name="thingtype" type="pef:ThingType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- *****************************************-->
	<!-- Operation-type related definitions -->
	<!-- *****************************************-->
	<!-- Operation-type ID -->
	<xs:simpleType name="oid">
		<xs:restriction base="xs:string">
			<xs:pattern value="O\d+"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="OperationTypeClassification">
		<xs:restriction base="xs:string">
			<xs:enumeration value="manual"/>
			<xs:enumeration value="auto-called"/>
			<xs:enumeration value="auto-added"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="InvolvementType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="input"/>
			<xs:enumeration value="output"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Operation-type -->
	<xs:complexType name="OperationType">
		<xs:sequence>
			<xs:element name="opertype_id" type="pef:oid"/>
			<xs:element name="opertype_name" type="xs:string"/>
			<xs:element name="opertype_type" type="pef:OperationTypeClassification"/>
			<xs:element name="executing" type="pef:did"/>
			<xs:element name="requirement_source" type="pef:ReqSourceType"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Operation-type list -->
	<xs:complexType name="OperationTypeList">
		<xs:sequence>
			<xs:element name="opertype" type="pef:OperationType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- ******************************************-->
	<!-- Connection-type related definitions -->
	<!-- ******************************************-->
	<!-- Connection-type identifiers -->
	<xs:simpleType name="cid">
		<xs:restriction base="xs:string">
			<xs:pattern value="C\d+"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Connection-type -->
	<xs:complexType name="ConnectionType">
		<xs:sequence>
			<xs:element name="conntype_id" type="pef:cid"/>
			<xs:element name="conntype_name" type="xs:string"/>
			<!-- perspective element -->
			<xs:element name="perspective" minOccurs="2" maxOccurs="2">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="perspective_no">
							<xs:simpleType>
								<xs:restriction base="xs:string">
									<xs:pattern value="[ab]"/>
								</xs:restriction>
							</xs:simpleType>
						</xs:element>	
						<xs:choice>
							<xs:element name="involved_thingtype" type="pef:did"/>
							<xs:element name="involved_opertype" type="pef:oid"/>
						</xs:choice>
						<xs:element name="perspective_name" type="xs:string"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
			<!-- end of perspective element -->
			<xs:element name="requirement_source" type="pef:ReqSourceType"/>
		</xs:sequence>
	</xs:complexType>
	<!-- Connection-type list -->
	<xs:complexType name="ConnectionTypeList">
		<xs:sequence>
			<xs:element name="conntype" type="pef:ConnectionType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>
