<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.w3.org/2005/SCXML" xmlns:scxml="http://www.w3.org/2005/SCXML">
  <!-- Here is our top level rule -->
  <xs:element name="scxml">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:state"/>
      </xs:sequence>
      <xs:attribute name="version" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:token">
            <xs:enumeration value="1.0"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="initialstate" type="xs:IDREF"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="state">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="scxml:initial"/>
        <xs:element ref="scxml:onentry"/>
        <xs:element ref="scxml:onexit"/>
        <xs:element ref="scxml:transition"/>
        <xs:element ref="scxml:state"/>
        <xs:element ref="scxml:parallel"/>
        <xs:element ref="scxml:history"/>
        <xs:element ref="scxml:sync"/>
        <xs:element ref="scxml:join"/>
      </xs:choice>
      <xs:attribute name="id" type="xs:ID"/>
      <xs:attribute name="final" default="false" type="xs:boolean"/>
      <xs:attribute name="src" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="parallel">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="scxml:onentry"/>
        <xs:element ref="scxml:onexit"/>
        <xs:element ref="scxml:state"/>
        <xs:element ref="scxml:sync"/>
        <xs:element ref="scxml:join"/>
      </xs:choice>
      <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="initial">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:transition"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID"/>
      <xs:attribute name="src" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="history">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:transition"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID"/>
      <xs:attribute name="type" default="shallow">
        <xs:simpleType>
          <xs:restriction base="xs:token">
            <xs:enumeration value="shallow"/>
            <xs:enumeration value="deep"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="src" type="xs:anyURI"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="join">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:transition"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="sync">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:transition"/>
      </xs:sequence>
      <xs:attribute name="id" type="xs:ID"/>
      <xs:attribute name="bound" default="0" type="xs:integer"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="transition">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:choice>
          <xs:element ref="scxml:target"/>
          <xs:element ref="scxml:exit"/>
        </xs:choice>
        <xs:choice>
          <xs:element ref="scxml:assign"/>
          <xs:element ref="scxml:var"/>
          <xs:element ref="scxml:log"/>
          <xs:element ref="scxml:send"/>
          <xs:element ref="scxml:if"/>
          <xs:group ref="scxml:anyOtherNSElement"/>
        </xs:choice>
      </xs:choice>
      <xs:attribute name="event"/>
      <xs:attribute name="cond"/>
      <xs:attribute name="name"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="target">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="scxml:state"/>
      </xs:sequence>
      <xs:attribute name="next" type="xs:IDREF"/>
      <xs:attribute name="cond"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="onentry">
    <xs:complexType>
      <xs:group minOccurs="0" maxOccurs="unbounded" ref="scxml:ExecutableContent"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="onexit">
    <xs:complexType>
      <xs:group minOccurs="0" maxOccurs="unbounded" ref="scxml:ExecutableContent"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="log">
    <xs:complexType>
      <xs:attribute name="expr"/>
      <xs:attribute name="label"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="if">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:elseif"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:else"/>
        <xs:group minOccurs="0" maxOccurs="unbounded" ref="scxml:ExecutableContent"/>
      </xs:sequence>
      <xs:attribute name="cond"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="elseif">
    <xs:complexType>
      <xs:attribute name="cond"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="else">
    <xs:complexType/>
  </xs:element>
  <xs:element name="assign">
    <xs:complexType>
      <xs:attribute name="expr" use="required"/>
      <xs:attribute name="name" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="var">
    <xs:complexType>
      <xs:attribute name="expr"/>
      <xs:attribute name="name" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="exit">
    <xs:complexType>
      <xs:attribute name="expr"/>
      <xs:attribute name="namelist"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="send">
    <xs:complexType>
      <xs:group minOccurs="0" maxOccurs="unbounded" ref="scxml:anyOtherNSElement"/>
      <xs:attribute name="target"/>
      <xs:attribute name="targettype" default="scxml"/>
      <xs:attribute name="sendid"/>
      <xs:attribute name="delay" default="'0s'"/>
      <xs:attribute name="event"/>
      <xs:attribute name="hints"/>
      <xs:attribute name="namelist"/>
    </xs:complexType>
  </xs:element>
  <xs:group name="anyOtherNSElement">
    <xs:choice>
      <xs:any namespace="##other" processContents="skip"/>
      <xs:any namespace="##local" processContents="skip"/>
    </xs:choice>
  </xs:group>
  <xs:group name="ExecutableContent">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:assign"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:var"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:log"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:send"/>
      <xs:element minOccurs="0" maxOccurs="unbounded" ref="scxml:if"/>
      <xs:group minOccurs="0" maxOccurs="unbounded" ref="scxml:anyOtherNSElement"/>
    </xs:sequence>
  </xs:group>
</xs:schema>