<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://standards.ieee.org/downloads/1734/1734-2011"
  xmlns="http://standards.ieee.org/downloads/1734/1734-2011">

<!-- Elements -->
  <xs:element name="qipReference" type="qipReferenceType"/>
  <xs:element name="assessment" type="assessmentType"/>
  <xs:element name="topic" type="topicType"/>
  <xs:element name="criterium" type="criteriumType"/>

  <xs:element name="subTypes" type="subTypesType" />
  <xs:element name="subType" type="subTypeType"></xs:element>
  <xs:element name="summary" type="summaryType"/>
  <xs:element name="comment" type="commentType"/>
  <xs:element name="author" type="authorType"/>
  <xs:element name="validSince" type="dateType"/>
  <xs:element name="invalidSince" type="dateType"/>
  <xs:element name="type" type="typeType"/>
  <xs:element name="class" type="classType"/>
  <xs:element name="weight" type="weightType"/>
  <xs:element name="dependent" type="dependentType"/>

<!-- Attributes -->
  <xs:attribute name="version" type="xs:float"/>
  <xs:attribute name="id" type="xs:int"/>
  <xs:attribute name="order" type="xs:float"/>
  <xs:attribute name="title" type="xs:string"/>
  <xs:attribute name="qipId">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="(v?)(\d+)(\.\d+)*"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:attribute>

<!-- Simple Types -->
  <xs:simpleType name="subTypeType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Digital"></xs:enumeration>
      <xs:enumeration value="Analog/AMS"></xs:enumeration>
      <xs:enumeration value="I/O and ESD"></xs:enumeration>
      <xs:enumeration value="Memory"></xs:enumeration>
      <xs:enumeration value="MEMS"></xs:enumeration>
      <xs:enumeration value="DupEnabled"></xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="summaryType">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:simpleType name="commentType">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:simpleType name="authorType">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:simpleType name="dateType">
    <xs:restriction base="xs:string">
      <xs:pattern value="(\s*\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\s*)?">
      </xs:pattern>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="typeType">
    <xs:union> 
      <xs:simpleType>  
        <xs:restriction base="xs:string">
          <xs:enumeration value="a/o/n"/>
          <xs:enumeration value="y/n"/>
          <xs:enumeration value="text"/>
        </xs:restriction>  
      </xs:simpleType> 
      <xs:simpleType>
        <xs:restriction base="emptyType"/>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>
  <xs:simpleType name="classType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Imperative"></xs:enumeration>
      <xs:enumeration value="Rule"></xs:enumeration>
      <xs:enumeration value="Guideline"></xs:enumeration>
      <xs:enumeration value="Optional"></xs:enumeration>
      <xs:enumeration value="Mitigable"></xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="weightType">
    <xs:restriction base="xs:int"/>
  </xs:simpleType>
  <!-- Define an empty type -->
  <xs:simpleType name="emptyType">
    <xs:restriction base="xs:string">
      <xs:maxLength value="0"/>
    </xs:restriction>
  </xs:simpleType>
  <!-- Dependent element is an integer but can also be empty -->
  <xs:simpleType name="dependentType">
    <xs:union>      
      <xs:simpleType>
        <xs:restriction base="xs:int"/>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="emptyType"/>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

<!-- Complex Types -->
  <xs:complexType name="subTypesType">
  	<xs:sequence>
  		<xs:element ref="subType" maxOccurs="unbounded" minOccurs="0"></xs:element>
  	</xs:sequence>
  </xs:complexType>

  <xs:complexType name="qipReferenceType">
    <xs:sequence>
      <xs:element ref="assessment" maxOccurs="unbounded" minOccurs="1">
	  </xs:element>
    </xs:sequence>
    <xs:attribute ref="version"/>
  </xs:complexType>

  <xs:complexType name="assessmentType">
    <xs:sequence>
      <xs:element ref="topic" maxOccurs="unbounded" minOccurs="1">
			</xs:element>
    </xs:sequence>
    <xs:attribute ref="id"/>
    <xs:attribute ref="order"/>
    <xs:attribute ref="title"/>
  </xs:complexType>

  <xs:complexType name="topicType">
    <xs:choice maxOccurs="unbounded" minOccurs="0">
      <xs:element ref="topic"/>
      <xs:element ref="criterium"/>
    </xs:choice>
    <xs:attribute ref="id"/>
    <xs:attribute ref="order"/>
    <xs:attribute ref="qipId"/>
    <xs:attribute ref="title"/>
  </xs:complexType>

  <xs:complexType name="criteriumType">
    <xs:sequence>
      <xs:element ref="subTypes"/>
      <xs:element ref="summary"/>
      <xs:element ref="comment"/>
      <xs:element ref="author"/>
      <xs:element ref="validSince"/>
      <xs:element ref="invalidSince"/>
      <xs:element ref="type"/>
      <xs:element ref="class"/>
      <xs:element ref="weight"/>
      <xs:element ref="dependent"/>
    </xs:sequence>
    <xs:attribute ref="id"/>
    <xs:attribute ref="order"/>
    <xs:attribute ref="qipId"/>
  </xs:complexType>
 
</xs:schema>
