State Chart XML (SCXML) is a general-purpose event-based state machine language that can be used in many ways.
The definitive guide to authoring SCXML documents is the W3C Working Draft of the SCXML specification .
Here is the canonical hello world example for SCXML. The interesting bits are:
<scxml xmlns="http://www.w3.org/2005/07/scxml"
version="1.0"
initialstate="hello">
<state id="hello" final="true">
<onentry>
<log expr="'hello world'" />
</onentry>
</state>
</scxml>
Transitions allow the state machine to change state. A transition is "followed" if its "trigger event" is received, and the "guard condition", if one is available is valid.
Here are some transition variants:
<!--
... begin scxml, some states ...
-->
<state id="foo1">
<!--
... some content ...
-->
<transition target="bar" />
</state>
<state id="foo2">
<!--
... some content ...
-->
<transition event="foo.bar" target="bar" />
</state>
<state id="foo3">
<!--
... some content ...
-->
<transition event="foo.bar" cond="some-boolean-expression"
target next="bar" />
</state>
<state id="bar">
<!--
... some content ...
-->
</state>
<!--
... remaining states, end scxml ...
-->
States can contain states, so we can think of an SCXML document as a recursive transition network. Here is a snippet (here is the entire version of this microwave example ):
<!--
... begin snippet ...
-->
<state id="on">
<initial>
<transition target="idle"/>
</initial>
<state id="idle">
<!-- content for state "idle" -->
</state>
<state id="cooking">
<!-- content for state "cooking" -->
</state>
<!-- other content for state "on" -->
<!--
... end snippet ...
-->
This is a wrapper element that encapsulates multiple <state>s -- or state machines, since in the section on composite states we took a look at the "recursion" or "nesting" for the <state> element, whereby each state can become a state machine in its own right -- that are "active" at the same time. Here is a relevant snippet (the entire version of this parallel microwave example ):
<!--
... begin snippet ...
-->
<state id="microwave">
<parallel id="parts">
<state id="oven">
<!-- state machine for "oven" (idle/cooking) -->
</state>
<state id="door">
<!-- state machine for "door" (open/closed) -->
</state>
</parallel>
</state>
<!--
... end snippet ...
-->
The Commons SCXML implementation allows you to register custom actions. Here is the Commons SCXML hello world example using a custom action . The interesting bits are:
<scxml xmlns="http://www.w3.org/2005/07/scxml"
xmlns:my="http://my.custom-actions.domain/CUSTOM"
version="1.0"
initialstate="custom">
<state id="custom" final="true">
<onentry>
<my:hello name="world" />
</onentry>
</state>
</scxml>