<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    targetNamespace="http://protege.stanford.edu/xml" 
    xmlns="http://protege.stanford.edu/xml" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified">
    
    <xs:annotation>
        <xs:documentation xml:lang="en">XML Schema for Protege, cut down to use just simple instances for the Essential Architecture Manager import solution, Essential Integration Server. The Protege namespaces are preserved.</xs:documentation>
    </xs:annotation>
    
    <xs:element name="knowledge_base" type="KnowledgeBaseType"/>
    
    <xs:complexType name="KnowledgeBaseType">
        <xs:sequence>
            <xs:element name="timestamp" type="xs:dateTime" minOccurs="0" maxOccurs="1">
                <xs:annotation>
                    <xs:documentation>Optional timestamp tag to indicate dateTime when the XML document was generated</xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:choice minOccurs="0" maxOccurs="unbounded">                
                <xs:element ref="simple_instance"/>
            </xs:choice>
        </xs:sequence>
    </xs:complexType>
    
    <xs:simpleType name="FrameNameType">
        <xs:restriction base="xs:string"/>
    </xs:simpleType >
    
    <xs:complexType name="InstanceType">
        <xs:sequence>
            <xs:element name="name" type="FrameNameType">
                <xs:annotation>
                    <xs:documentation>Unique identifier for an instance. If importing from another repository, this is typically the repository internal ID for the instance</xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element name="type" type="FrameNameType" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>The type of the instance, i.e. the name of the Essential Meta Class that this element is an instance of.</xs:documentation>
                </xs:annotation>
            </xs:element>
            <xs:element ref="own_slot_value" minOccurs="0" maxOccurs="unbounded">
                <xs:annotation>
                    <xs:documentation>Name-value pairs for populated slots for this element. The slot_reference specifies the name of the slot that is populated and the value is the value of the slot on this instance.</xs:documentation>
                </xs:annotation>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    
    <xs:element name="simple_instance">
        <xs:complexType>
            <xs:complexContent>
                <xs:extension base="InstanceType"/>
            </xs:complexContent>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="own_slot_value">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="slot_reference" type="FrameNameType"/>
                <xs:element ref="value" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    <xs:element name="template_facet_value">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="slot_reference" type="FrameNameType"/>
                <xs:element name="facet_reference" type="FrameNameType"/>
                <xs:element ref="value" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
    <xs:simpleType name="ValueType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="boolean"/>
            <xs:enumeration value="float"/>
            <xs:enumeration value="integer"/>
            <xs:enumeration value="string"/>
            <xs:enumeration value="class"/>
            <xs:enumeration value="slot"/>
            <xs:enumeration value="facet"/>
            <xs:enumeration value="simple_instance"/>
        </xs:restriction>
    </xs:simpleType>
    
    <xs:element name="value">
        <xs:complexType>
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="value_type" type="ValueType" use="required">
                    </xs:attribute>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    </xs:element>
    
</xs:schema>
