W3C

State Chart XML (SCXML): State Machine Notation for Control Abstraction

W3C Working Draft 16 26 December April 2010 2011

This version:
http://www.w3.org/TR/2010/WD-scxml-20101216/ http://www.w3.org/TR/2011/WD-scxml-20110426/
Latest version:
http://www.w3.org/TR/scxml/
Previous version:
http://www.w3.org/TR/2010/WD-scxml-20100513/ http://www.w3.org/TR/2010/WD-scxml-20101216/
Editors:
Jim Barnett, Genesys (Editor-in-Chief)
Rahul Akolkar, IBM
RJ Auburn, Voxeo
Michael Bodell, Microsoft
Daniel C. Burnett, Voxeo
Jerry Carter, (until 2008, when at Nuance)
Scott McGlashan, HP
Torbjörn Lager, Invited Expert
Mark Helbing, (until 2006, when at Nuance)
Rafah Hosn, (until 2008, when at IBM)
T.V. Raman, (until 2005, when at IBM)
Klaus Reifenrath, (until 2006, when at Nuance)
No'am Rosenthal, (until 2009, when at Nokia)

Abstract

This document describes SCXML, or the "State Chart extensible Markup Language". SCXML provides a generic state-machine based execution environment based on CCXML and Harel State Tables.

Status of this Document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

This document is the eighth ninth Public Working Draft of SCXML published on 16 December 26 April 2010 for review by W3C Members and other interested parties, and has been developed by the Voice Browser Working Group as part of the W3C Voice Browser Activity . The main difference from the previous draft is corrections to the removal of profiles. interpretation algorithm. A diff-marked version of this document is also available for comparison purposes.

Comments for this specification are welcomed to www-voice@w3.org ( archives ).

This document was produced by a group operating under the 5 February 2004 W3C Patent Policy . W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

Table of Contents

1 Terminology
2 Overview
3 Core Constructs
    3.1 Introduction
    3.2 <scxml>
        3.2.1 Attribute Details         3.2.2 Children     3.3 <state>
        3.3.1 Attribute Details         3.3.2 Children     3.4 <transition>         3.4.1 Attribute Details         3.4.2 Children         3.4.3 Selecting and Executing Transitions     3.5 <parallel>
        3.5.1 Attribute Details         3.5.2 Children     3.5 <transition>
    3.6 <initial>
        3.6.1 Attribute Details         3.6.2 Children     3.7 <final>
        3.7.1 Attribute Details         3.7.2 Children     3.8 <onentry>
        3.8.1 Attribute Details         3.8.2 Children     3.9 <onexit>
        3.9.1 Attribute Details         3.9.2 Children     3.10 <history>
        3.10.1 Attribute Details         3.10.2 Children     3.11 Legal State Configurations and Specifications
    3.12 SCXML Events
        3.12.1 Event Descriptors     3.13 Errors Selecting and Executing Transitions
    3.14 IDs
4 Executable Content
    4.1 Introduction
    4.2 <raise>
        4.2.1 Attribute Details         4.2.2 Children     4.3 <if>
        4.3.1 Attribute Details         4.3.2 Children     4.4 <elseif>
        4.4.1 Overview         4.4.2 Attribute Details     4.5 <else>
        4.5.1 Overview         4.5.2 Attribute Details     4.6 <foreach>
    4.6     4.7 <log>
        4.6.1 Overview         4.6.2 Attribute Details         4.6.3 Children     4.7     4.8 Other Executable Content
    4.8     4.9 Evaluation of Executable Content
    4.9     4.10 Extensibility of Executable Content
5 Data Model and Data Manipulation
    5.1 Introduction
    5.2 <datamodel>
        5.2.1 Attribute Details         5.2.2 Children     5.3 <data>
        5.3.1 Attribute Details         5.3.2 Children         5.3.3 Data Binding and Scoping     5.4 <assign>
        5.4.1 Attribute Details         5.4.2 Children     5.5 <validate>
        5.5.1 Attribute Details         5.5.2 Children     5.6 <donedata>
        5.6.1 Attribute Details         5.6.2 Children     5.7 <content>
        5.7.1 Attribute Details         5.7.2 Children     5.8 <param>
        5.8.1 Attribute Details         5.8.2 Children     5.9 <script>
        5.9.1 Attribute Details         5.9.2 Children     5.10 Expressions
        5.10.1 Conditional Expressions         5.10.2 Location Expressions         5.10.3 Legal Data Values and Value Expressions         5.10.4 Errors in Expressions     5.11 System Variables
        5.11.1 The Internal Structure of Events 6 External Communications
    6.1 Introduction
    6.2 <send>
        6.2.1 Overview         6.2.2 Attribute Details         6.2.3 Children         6.2.4 The Target of Send         6.2.5 The Type of Send         6.2.6 Message Content     6.3 <cancel>
        6.3.1 Attribute Details         6.3.2 Children     6.4 <invoke>
        6.4.1 Attribute Details         6.4.2 Children         6.4.3 Data Sharing         6.4.4 Implementation     6.5 <finalize>
        6.5.1 Attribute Details         6.5.2 Children

Appendices

A Open Issues     A.1 Schema is Missing     A.2 Algorithm Doesn't Handle Internal Transitions     A.3 Iterative Construct     A.4 Simplification of <send> and <raise>     A.5 autoforward behavior B Algorithm for SCXML Interpretation
C B Schemas Schema
D C Conformance
    D.1     C.1 Conforming Documents
    D.2     C.2 Conforming Processors
E D Data Models
    E.1     D.1 The Null Data Model
        E.1.1 Data Model         E.1.2 Conditional Expressions         E.1.3 Location Expressions         E.1.4 Value Expressions         E.1.5 Scripting         E.1.6 System Variables         E.1.7 Unsupported Elements     E.2     D.2 The ECMAScript Data Model
        E.2.1 Data Model         E.2.2 Conditional Expressions         E.2.3 Location Expressions         E.2.4 Value Expressions         E.2.5 System Variables         E.2.6 Scripting         E.2.7 Unsupported Elements     E.3     D.3 The XPath Data Model
        E.3.1 Conditional Expressions         E.3.2 Location Expressions         E.3.3 Value Expressions         E.3.4 System Variables         E.3.5 Scripting         E.3.6 <assign> Element Extension         E.3.7 Unsupported Elements F E Event I/O Processors
    F.1     E.1 SCXML Event I/O Processor
        F.1.1 Examples     F.2     E.2 Basic HTTP Event I/O Processor
        F.2.1 Access URI         F.2.2 Receiving Events         F.2.3 Sending Events     F.3     E.3 DOM Event I/O Processor
        F.3.1 Sending Events         F.3.2 Receiving Events G F Related Work
H G Examples
    H.1     G.1 Language Overview
    H.2     G.2 Microwave Example
    H.3     G.3 Microwave Example (Using parallel)
    H.4     G.4 Calculator Example
    H.5     G.5 Shale Example
    H.6     G.6 Examples of Invoke and finalize
    H.7     G.7 Inline Content and Namespaces
    G.8 Custom Action Elements
I H References


1 Terminology

[ Definition : The key words must , must not , required , shall , shall not , should , should not , recommended , may , MUST ,MUST NOT ,REQUIRED ,SHALL ,SHALL NOT ,SHOULD ,SHOULD NOT ,RECOMMENDED ,MAY , and optional OPTIONAL in this specification are to be interpreted as described in [IETF RFC 2119] .] .

The terms base URI and relative URI are used in this specification as they are defined in [IETF RFC 2396] .

All sections not marked as "informative" are normative.

2 Overview

[This section is informative.]

This document outlines State Chart XML (SCXML), which is a general-purpose event-based state machine language that can be used in many ways, including: As a high-level dialog language controlling VoiceXML 3.0's encapsulated speech modules (voice form, voice picklist, etc.) As a voice application metalanguage, where in addition to VoiceXML 3.0 functionality, it may also control database access and business logic modules. As a multimodal control language in the MultiModal Interaction framework [W3C MMI] , combining VoiceXML 3.0 dialogs with dialogs in other modalities including keyboard and mouse, ink, vision, haptics, etc. It may also control combined modalities such as lipreading (combined speech recognition and vision) speech input with keyboard as fallback, and multiple keyboards for multi-user editing. As the state machine framework for a future version of CCXML. As an extended call center management language, combining CCXML call control functionality with computer-telephony integration for call centers that integrate telephone calls with computer screen pops, as well as other types of message exchange such as chats, instant messaging, etc. As a general process control language in other contexts not involving speech processing. SCXML combines concepts from CCXML and Harel State Tables. CCXML [W3C CCXML 1.0] is an event-based state machine language designed to support call control features in Voice Applications (specifically including VoiceXML but not limited to it). The CCXML 1.0 specification defines both a state machine and event handing syntax and a standardized set of call control elements. Harel State Tables are a state machine notation that was developed by the mathematician David Harel [Harel and Politi] and is included in UML [UML 2.3] . They offer a clean and well-thought out semantics for sophisticated constructs such as a parallel states. They have been defined as a graphical specification language, however, and hence do not have an XML representation. The goal of this document is to combine Harel semantics with an XML syntax that is a logical extension of CCXML's state and event notation.

3 Core Constructs 3.1 Introduction The Core Module contains the elements that define presents the basic Harel state machine. 3.2 <scxml> The top-level wrapper element, which carries version information. The actual core state machine consists of its children. etc. 3.2.1 Attribute Details Name Required Attribute Constraints Type Default Value Valid Values Description initial false none IDREFS none A legal state specification. See concepts, while 3.11 Legal State Configurations and Specifications 4 Executable Content for details. The id of the initial state(s) for the document. If not specified, the default initial state is the first child state in document order. name false none NMTOKEN none Any valid NMTOKEN The name contains an extensible set of this state machine. It is for purely informational purposes. xmlns true none URI none The value must be "http://www.w3.org/2005/07/scxml". version true none decimal none The only legal value is "1.0" datamodel false none NMTOKEN "none" "none", "ecmascript", "xpath" or other platform-defined values. The datamodel actions that this document requires. "none" denotes the Empty datamodel, "ecmascript" the ECMAScript datamodel, and "xpath" the XPath datamodel, as defined state machine can take in response to events. E 5 Data Models Model and Data Manipulation . binding false enum "early" "early", "late" The data binding to use. See defines constructs for storing and modifying data, while 5.3.3 Data Binding and Scoping 6 External Communications for details. exmode false enum "lax" "lax", "strict" Determines whether provides the processor should silently ignore markup that it does not support. capability of communicating with external entities.

3 Core Constructs

3.1 Introduction

[This section is informative.]

3.2.2 Children 3.1.1 Basic State Machine Notation

<state> A compound or atomic state. Occurs zero or more times. See

The most basic state machine concepts are 3.3 <state> for details. <parallel> A parallel state. Occurs zero or more times. See , 3.5 <parallel> <transition> for details. <final> A top-level final and event ( 3.12 SCXML Events ). Each state in contains a set of transitions that define how it reacts to events. Events can be generated by the state machine. Occurs zero machine itself or more times. by external entities. In a traditional state machine, the machine is always in a single state. This state is called the active state. When an event occurs, the state machine reaches this state checks the transitions that are defined in the active state. If it has finished processing and will terminate. See finds one that matches the event, it moves from the active state to the state specified by the transition (called the "target" of the transition.) Thus the target state becomes the new active state.

The Harel state notation defines several extensions to these basic notions. First of all, the state machine may take actions (as defined in 3.7 <final> 4 Executable Content for details. <datamodel> Defines part or all of the datamodel. Occurs 0 or 1 times. See ) while taking transitions. Specifically, each state may contain 5.2 <datamodel> 3.8 <onentry> <script> Provides scripting capability. Occurs 0 or 1 times. and 5.9 <script> 3.9 <onexit> actions. Transitions may also contain actions. If 'exmode' is "lax", the SCXML processor MUST silently ignore any markup that a state machine takes transition T from state S1 to state S2, it does not support, including markup first performs the onexit actions in non-scxml namespaces. (Examples of unsupported elements include elements S1, then the actions in T, then the onentry actions in S2. Secondly, in addition to the 'event' attribute that are not part of specifies the specified data model or executable content event(s) that some other platform can trigger it, transitions also have a 'cond' attribute. If a transition has defined as both 'event' and 'cond' attributes, it will be selected only if an extension.) If 'exmode' event is "strict", raised whose name matches the SCXML processor MUST treat such markup as syntactically invalid 'event' attribute (see 3.12.1 Event Descriptors for details) and reject the 'cond' condition evaluates to true. If the 'event' attribute is missing, the transition is taken whenever the 'cond' evaluates to true. If more than one transition matches, the first one in document at initialization time. order will be taken. Thus, in the following example, the system will transition to s1 when event e (or e.foo, etc.) occurs if x is equal to 1, but will transition to s2 if event e (or e.foo, etc.) occurs and x is not equal to 1, and will go to s3 if any other event occurs.

<state id=s">
   <transition event="e" cond="x==1" target="s1"/>
   <transition event="e" target="s2"/>
   <transition event="*" target="s3"/>
</state>

3.3 <state>

Holds The data model can be changed only by the representation execution of <invoke> or executable content. Therefore transitions with missing 'event' attributes need be checked only after a state. 3.3.1 Attribute Details Name Required Attribute Constraints Type Default Value Valid Values Description id false none ID none A valid id as defined in [XML Schema] The identifier for this state. transition has been taken. See 3.14 IDs A Algorithm for SCXML Interpretation for details. initial false May not be specified in conjunction with

3.1.2 Compound States

One of the <initial> element. May only occur most powerful concepts in states Harel notation is the idea that states may have child internal structure. In particular, a <state> element may contain nested <state> or <parallel> elements. IDREFS none A legal Such a state specification. See is called a compound state and we speak of it as the parent state, while the nested elements are child states. The child states may themselves have nested children and the nesting may proceed to any depth. Ultimately we will reach a state that does not contain any child states. Such a state is called an atomic state. When a compound state is active, one and only one of its child states is active. Conversely, when an child state is active, its parent state must be active too. Thus at any point we have a set of active states, containing an atomic state and all of its ancestors. (We will see in the next section that multiple atomic states can be active at the same time.)

3.1.2.1 Initial, Final, and History States

In the presence of compound states, transitions no longer simply move from the current active state to a new active state, but from one set of active states to another. (See 3.11 Legal State Configurations and Specifications for details. The id details.) If the target of a transition is an atomic state, the default initial state (or states) for this state. A complex machine will enter not only the atomic state, namely one but also any of its ancestor states that has <state> or <parallel> children, are not already active. Conversely, a transition may specify either an "initial" attribute or an <initial> element, take a compound state as its target. In this case, one of the compound state's children must also become active, but the transition does not both. Either notation can be used to specify which one. In this case we look at the target state's default initial state. See 3.6 <initial> for child which specifies the state's default initial state, that is, the child state to enter if the transition does not specify one. (If the default initial state is itself compound, the state machine will also enter its default initial state, and so on recursively until it reaches an atomic state.) The presence of default initial states provides a discussion form of encapsulation, since a transition may select a compound state as its target without understanding its internal substate structure.

The default initial state of a compound state may also be specified via the 'initial' attribute. The only difference between the two notations. <initial> element and the 'initial' attribute is that the <initial> element contains a <transition> element which may in turn contain executable content which will be executed before the default state is entered. If neither the "initial" 'initial' attribute nor an is specified instead, the specified state will be entered, but no executable content will be executed. (If neither the <initial> child or the 'initial' element is specified, the default initial state is the first child state in document order.) As an example, suppose that parent state S contains child states S1 and S2 in that order. 3.3.2 Children <onentry> Optional element holding executable content If S specifies S1 as its default initial state via the 'initial' attribute (or fails to be run upon specify any initial state), then any transition that specifies S as its target will result in the state machine entering S1 as well as S. In this <state>. Occurs 0 or 1 times. See 3.8 <onentry> <onexit> Optional case, the result is exactly the same as if the transition had taken S1 as its target. If, on the other hand, S specifies S1 as its default initial state via an <initial> element holding executable content to be run when exiting this <state>. Occurs 0 or 1 times. See 3.9 <onexit> containing a <transition> Defines an outgoing transition from this state. Occurs 0 or more times. See 3.4 with S1 as its target, the <transition> <initial> In states that have substates, an optional child can contain executable content which identifies will execute before the default initial state. Any entry into S1. In this case, there is a difference between a transition which that takes the parent state S as its target will result and one that takes S1 as its target. In the former case, but not in the statemachine also taking latter, the transition contained executable content inside the <initial> element. See transition will be executed.

A compound state may also have final and history states as children. 3.6 <initial> 3.7 <final> <state> Defines a sequential substate of is used to signify that the parent state. Occurs 0 or more times. <parallel> Defines a parallel substate. Occurs 0 or more times. See 3.5 <parallel> <final>. Defines a final substate. Occurs 0 or more times. state is in some sense "done" with its processing. When the a state machine enters a final substate, an <final> substate of a compound state, the parent state remains active, but the event done.state. "done.state. id " is generated, where id is the state id of the final state's parent state. This event indicates that the parent can trigger a transition in any ancestor state has reached completion. See 3.7 <final> . <history> A child pseudo-state which records (including the descendant state(s) that parent). If the parent state was in transition takes a target outside the last time parent state, the system transitioned "done.state. from id " event in effect serves as a signal that it is time to leave the parent. May occur 0 or more times. See parent state. 3.10 <history> . <datamodel> Defines part or all of the datamodel. Occurs 0 or 1 times. See 5.2 <datamodel> <invoke> Invokes an external service. Occurs 0 or more times. See 6.4 <invoke> allows for details. 3.4 <transition> Transitions between states are triggered by events pause and conditionalized via guard conditions. They may contain executable content, which is executed when resume semantics in compound states. Before the transition is taken. 3.4.1 Attribute Details Name Required Attribute Constraints Type Default Value Valid Values Description event false At least one of 'event', 'cond' or 'target' must be specified. NMTOKENS none A space-separated list of event descriptors. See 3.12.1 Event Descriptors for details. A list of designators of events that trigger this transition. The transition will be taken only when an event is generated that matches state machine exits a descriptor on this list (see 3.12.1 Event Descriptors for details.) Also see B Algorithm for SCXML Interpretation for details on how transitions are selected. cond false At least one of 'event', 'cond' or 'target' must be specified. Boolean expression 'true' Any boolean expression. The guard condition for this transition. The transition is selected only if compound state, it records the condition evaluates to true . See 5.10.1 Conditional Expressions for details. target false At least one state's active descendents. If the 'type' attribute of 'event', 'cond' or 'target' must be specified. IDREFS none A legal the <history> state specification. See 3.11 Legal State Configurations and Specifications for details. The identifier(s) of is set to "deep", the state or parallel region machine saves the state's full active descendent configuration, down to transition to. the atomic descendant(s). If it 'type' is omitted, set to "shallow", the state machine remembers only which immediate child was active. After that, if a transition will not cause takes a change in <history> child of the state configuration when it is executed. The executable content contained in the transition will still be executed, so the transition will function as a simple event handler. If its target, the target is present and equal to state machine re-enters not only the parent compound state containing but also the transition element, state(s) in the saved configuration. Thus a transition will cause the with a deep history state machine as its target returns to leave and then re-enter this state. See B Algorithm for SCXML Interpretation for details. type false None enum "external" "internal" "external" Determines whether exactly where the source state is exited in transitions whose target was when it was last exited, while a transition with a shallow history state is as a descendant of target re-enters the source state. See 3.4.3 Selecting and Executing Transitions for details. 3.4.2 Children The children of <transition> are executable content that is run after all previously active child state, but will enter the <onexit> handlers and before child's default initial state (if the all <onentry> handlers that are triggered by this transition. See 4 Executable Content child is itself compound.)

3.4.3 Selecting 3.1.2.2 Compound States and Executing Transitions If a transition has both 'event' and 'cond' attributes, it will be selected only if an event is raised whose name matches the 'event' attribute (see 3.12.1 Event Descriptors for details) and the 'cond' condition evaluates to true. If the 'event' attribute is missing, the transition is taken whenever the 'cond' evaluates to true.

Compound states also affect how transitions are selected. When looking for transitions, the state machine first looks in the most deeply nested active state(s), i.e., in the atomic state(s) that have no substates. If no transitions match in the atomic state, the state machine will look in its parent state, then in the parent's parent, etc. Thus transitions in ancestor states serve as defaults that will be taken if no transition matches in a descendant state. If no transition matches in any state, the event is discarded. If in any state more than one transition matches, the first one in document order will be taken. Thus, in the following example, the system will transition to s1 when event e (or e.foo, etc.) occurs if x is equal to 1, but will transition to s2 if event e (or e.foo, etc.) occurs and x is not equal to 1, and will go to s3 if any other event occurs.

<state id=s"> <transition event="e" cond="x==1" target="s1"/> <transition event="e" target="s2"/> <transition event="*" target="s3"/> </state>

Note that the data model can be changed only by In the execution case of <invoke> or executable content. Therefore transitions with missing 'event' attributes need be checked only after a transition has been taken. See B Algorithm for SCXML Interpretation for details. located in a compound state, the 'type' attribute is significant. The behavior of a transition with 'type' of "external" (the default) is defined in terms of the set of active states, the transition's source state, which state (which is the state that contains the transition, transition), the transition's target state(or states), and the Least Common Ancestor (LCA) of the source and target states. states (which is the closest state that is an ancestor of all the source and target states). When a transition is taken, the state machine will exit all active states that are proper descendants of the LCA are exited in exit order , LCA, starting with the innermost one(s) and working up to the immediate descendant(s) of the LCA. Then the state machine enters the target state(s), plus any states that are between it and the LCA, in entry order starting with the outermost one (i.e., the immediate descendant of the LCA) and working down to the target state(s). As states are exited, their <onexit> handlers are executed. Then the executable content in the transition is executed, followed by the <onentry> handlers of the states that are entered. If the target state(s) of the transition is not atomic, the state machine will enter their default initial states recursively until it reaches an atomic state(s).

In the example below, assume that state s11 is active when event 'e' occurs. The source of the transition is state s1, its target is state s21, and the LCA is state S. When the transition is taken, first state S11 is exited, then state s1, then state s2 is entered, then state s21. Note that the LCA S is neither entered nor exited. For more details see 3.13 Selecting and Executing Transitions and B A Algorithm for SCXML Interpretation .

<state id="S" initial="s1">
   <state id="s1" initial="s11">
      <onexit>
         <log expr="'leaving s1'"/>
     </onexit>
     
     <state id="s11">
        <onexit>
           <log expr="'leaving s11'"/>
        </onexit>
     </state>
     
     <transition event="e" target="s21">
        <log expr="'executing transition'"/>
     </transition>
   </state>
  
   <state id="s2" initial="s21">
      <state id="s21">
         <onentry>
            <log expr="'entering s21'"/>
         </onentry>
      </state>
      <onentry>
         <log expr="'entering s2'"/>
      </onentry>
   </state>
   <onentry>
     <log expr="'entering S'"/>
   <onentry>   
   <onexit>
     <log expr="'leaving S'"/>
   <onexit>
</state>
==== log output will be ======>
leaving s11
leaving s1
executing transition
entering s2
entering s21

The behavior of transitions with 'type' of "internal" is identical, except in the case of a transition whose source state is a compound state and whose target(s) is a descendant of the source. In such a case, an internal transition will not exit and re-enter its source state, while an external one will, as shown in the example below.

<state id="S" initial="s1">
   <state id="s1" initial="s11">
      <onentry>
        <log expr="entering S1"/>
        </onentry>
      <onexit>
         <log expr="'leaving s1'"/>
     </onexit>
     
     <state id="s11">
       <onentry>
        <log expr="entering s11"/>
       </onentry>
        <onexit>
           <log expr="'leaving s11'"/>
        </onexit>
     </state>
     
     <transition event="e" target="s11" type="internal">
        <log expr="'executing transition'"/>
     </transition>
   </state>
  
==== log output will be ======>
leaving s11
executing transition
entering s11
=== if transition were external, log output would be ====>
leaving s11
leaving s1
executing transition
entering s1
entering s11

If the 'target' on a <transition> is omitted, then the value of 'type' does not have any effect and taking the transition does not change the state configuration but does invoke the executable content that is included in the transition. Such a transition is equivalent to an event handler in Harel State Table notation. Note that this is different from a <transition> whose 'target' is its source state. In the latter case, the state is exited and reentered, triggering execution of its <onentry> and <onexit> executable content.

3.5 <parallel> 3.1.3 Parallel States

The <parallel> element is represents a state whose children execute in parallel. Like <state>, the <parallel> element contains <onentry>, <onexit>, <transition>, and <state> or <parallel> children. However, the semantics of <parallel> are different. When a <state> is active, exactly one of its children is active. When a <parallel> element is active, all of its children are active. Specifically, when the state machine enters the parent <parallel> state, it also enters each child state. The child states execute in parallel in the sense that any event that is processed is processed in each child state independently, and each child state may take a different transition in response to the event. (Similarly, one child state may take a transition in reponse to an event, while another child ignores it.) When all of the children reach final states, the <parallel> element itself is considered to be in a final state, and a completion event done.state. id is generated, where id is the id of the <parallel> element.

Transitions within the individual child elements operate normally. However whenever a transition is taken with a target outside the <parallel> element, the <parallel> element and all of its child elements are exited and the corresponding <onexit> handlers are executed. The handlers for the child elements execute first, in document order, followed by those of the parent <parallel> element, followed by an action expression in the <transition> element, and then the <onentry> handlers in the "target" state.

In the following example, parallel state 'p' has two children S1 and S2. Suppose a transition takes S1's child S12 as a target. (Note that this is permitted even though S12 is not the default initial state for S1 and that S11 is not, in fact, visited in the course of this example). Upon this transition, the state machine, in addition to enterering S1 and S12, will also enter S1's parallel sibling S2 and its initial state S21. Once the transition has been taken, p, S1, S2, S12, and S21 will all be active. If event 'e1' occurs, it will cause S12 to transition to S1Final, and S21 to transition to S22. Entering S1Final will cause the event done.state.S1 to be generated. At this point, S1 is in a final state, but S2 is still active. Now suppose event 'e2' occurs. This will cause S22 to transition to S2Final, and the event done.state.S2 will be generated. Furthermore, since all of p's children are now in final states, the event 'done.state.p' will be generated, which will cause the transition contained in p to be triggered, exiting the entire region.

<parallel id="p">
    <transition event="done.state.p" target="someOtherState"/>
    <state id="S1" initial="S11">
        <state id="S11">
            <transition event="e4" target="S12"/>
        </state>
        <state id="S12">
            <transition event="e1" target="S1Final"/>
        </state>
        <final id="S1Final"/>
    </state> 
    <state id="S2" initial="S21">
        <state id=S21">
            <transition event="e1" target="S22"/>
        </state>
        <state id="S22">
            <transition event="e2" target="S2Final/>
        </state>
        <final id="S2Final"/>
    </state> 
</parallel>

Note that the semantics of the <parallel> does not call for multiple threads or truly concurrent processing. The children of <parallel> execute in parallel in the sense that they are all simultaneously active and each one independently selects transitions for any event that is received. However, the parallel children process the event in a defined, serial order, so no conflicts or race conditions can occur. See B A Algorithm for SCXML Interpretation for a detailed description of the semantics <parallel> and the rest of SCXML.

3.2 <scxml>

The top-level wrapper element, which carries version information. The actual state machine consists of its children.

3.2.2 Children

If 'exmode' is "lax", the SCXML processor MUST silently ignore any markup that it does not support, including markup in non-scxml namespaces. (Examples of unsupported elements include elements that are not part of the specified data model or executable content that some other platform has defined as an extension.) If 'exmode' is "strict", the SCXML processor MUST treat such markup as syntactically invalid and reject the document at initialization time.

3.3 <state>

Holds the representation of a state.

3.5.2 3.3.2 Children

  • <onentry> Optional element holding executable content to be run upon entering this <state>. Occurs 0 or more times. See 3.8 <onentry>
  • <onexit> Optional element holding executable content to be run when exiting this <state>. Occurs 0 or more times. See 3.9 <onexit>
  • <transition> Defines an outgoing transition from this state. Occurs 0 or more times. See 3.5 <transition>
  • <initial> In states that have substates, an optional child which identifies the default initial state. Any transition which takes the parent state as its target will result in the statemachine also taking the transition contained inside the <initial> element. See 3.6 <initial>
  • <state> Defines a sequential substate of the parent state. Occurs 0 or more times.
  • <parallel> Defines a parallel substate. Occurs 0 or more times. See 3.4 <parallel>
  • <final>. Defines a final substate. Occurs 0 or more times. See 3.7 <final> .
  • <history> A child pseudo-state which records the descendant state(s) that the parent state was in the last time the system transitioned from the parent. May occur 0 or more times. See 3.10 <history> .
  • <datamodel> Defines part or all of the datamodel. Occurs 0 or 1 times. See 5.2 <datamodel>
  • <invoke> Invokes an external service. Occurs 0 or more times. See 6.4 <invoke> for details.

[ Definition : An atomic state is one that has no <state> or <parallel> children.]

[ Definition : A compound state is one that has <state>, <parallel>, or <final> children (or a combination of these).]

In a conformant SCXML document, a compound state MAY specify either an "initial" attribute or an <initial> element, but not both. See 3.6 <initial> for a discussion of the difference between the two notations. If neither the "initial" attribute nor an <initial> element is specified, the default initial state is the first child state in document order.

3.4 <parallel>

The <parallel> element encapsulates a set of child states which are simultaneously active when the parent element is active.

3.4.2 Children

A conformant SCXML document MUST NOT contain any transitions between parallel siblings. Specifically, if states Si and Sj are children of a <parallel> element, no transition may have Si (or a descendant of Si) as its source and Sj (or a descendent of Sj) as its target.

3.5 <transition>

In the following example, parallel state 'p' has two children S1 Transitions between states are triggered by events and S2. Suppose a conditionalized via guard conditions. They may contain executable content, which is executed when the transition takes S1's child S12 as a target. (Note is taken.

3.5.1 Attribute Details

Name Required Attribute Constraints Type Default Value Valid Values Description
event false At least one of 'event', 'cond' or 'target' must be specified. EventsTypes.datatype. none A space-separated list of event descriptors. See 3.12.1 Event Descriptors for details. A list of designators of events that trigger this transition. The transition will be taken only when an event is permitted even though S12 is not the default initial state generated that matches a descriptor on this list (see 3.12.1 Event Descriptors for S1 details.) Also see 3.13 Selecting and that S11 is not, in fact, visited in Executing Transitions and A Algorithm for SCXML Interpretation for details on how transitions are selected. See B Schema for the course definition of the datatype.
cond false At least one of 'event', 'cond' or 'target' must be specified. Boolean expression 'true' Any boolean expression. The guard condition for this example). Upon this transition, transition. The transition is selected only if the state machine, in addition condition evaluates to entering S1 and S12, will also enter S1's parallel sibling S2 and its initial true .See 5.10.1 Conditional Expressions for details.
target false At least one of 'event', 'cond' or 'target' must be specified. IDREFS none A legal state S21. Once the transition has been taken, p, S1, S2, S12, specification. See 3.11 Legal State Configurations and S21 will all be active. If event 'e1' occurs, it will cause S12 Specifications for details. The identifier(s) of the state or parallel region to transition to S1Final, to. See 3.13 Selecting and S21 to transition to S22. Entering S1Final will cause Executing Transitions and A Algorithm for SCXML Interpretation for details.
type false None enum "external" "internal" "external" Determines whether the event done.state.S1 to be generated. At this point, S1 source state is exited in a final state, but S2 transitions whose target state is still active. Now suppose event 'e2' occurs. This will cause S22 to transition to S2Final, and the event done.state.S2 will be generated. Furthermore, since all a descendant of p's the source state. See 3.13 Selecting and Executing Transitions for details.

3.13 Selecting and Executing Transitions contains more detail on the semantics of transitions.

3.6 <initial>

This element represents the default initial state for a complex <state> element (i.e. one one containing child <state> or <parellel> <parallel> elements. Suppose <state> S1 has child states S11, S12, and S13. If the system is in S1, it must also be in one (and only one) of S11, S12, or S13. A <transition> in a distinct <state> S2 may take S11, S12, or S13 as its target, but it may also simply specify the parent S1. In that case, the <initial> child of S1 specifies which of S11, S12, or S13 the system should transition to. The only difference between the <initial> element and the 'initial' attribute is that the <initial> element contains a <transition> element which may in turn contain executable content which will be executed before the default state is entered. If the 'initial' attribute is specified instead, the specified state will be entered, but no executable content will be executed. (If neither the <initial> child or the 'initial' element is specified, the first child state in document order will be entered, and no executable content will be executed.) As an example, suppose that parent state S contains child states S1 and S2. If S specifies S1 as its default initial state via the 'initial' attribute, then any transition that specifies S as its target will result in the state machine entering S1 as well as S. In this case, the result is exactly the same as if the transition had taken S1 as its target. If, on the other hand, S specifies S1 as its default initial state via an <initial> element containing a <transition> with S1 as its target, the <transition> can contain executable content which will execute before the default entry into S1. In this case, there is a difference between a transition that takes S as its target and one that takes S1 as its target. In the former case, but not in the latter, the executable content inside the <initial> transition will be executed.

3.7 <final>

<final> represents a final state of an <scxml> or compound <state> element. When the state machine enters the <final> child of a <state> element, the SCXML processor MUST after generate the event done.state. id after completion of the <onentry> elements, where id is the id of the parent state. When the state machine reaches the <final> child of an <scxml> element, it has finished processing and will terminate. See B Algorithm for SCXML Interpretation for details. If the SCXML session was triggered as the result by an <invoke> element in another session, the SCXML processor MUST generate the event done.invoke. id after termination and return it to the other session, where id is the unique identifier generated when the <invoke> element was executed. See 6.4 <invoke> for details. When a state machine is in a final substate of a compound state, the state is still active and will remain so until a transition is taken that exits it. Note, however, that if the compound state, or one of its ancestors, contains a transition triggered by the done.state. id event, the transition will be taken when that event is processed.

3.7.2 Children

When the state machine enters the <final> child of a <state> element, the SCXML processor MUST after generate the event done.state. id after completion of the <onentry> elements, where id is the id of the parent state. When the state machine reaches the <final> child of an <scxml> element, it MUST terminate. See A Algorithm for SCXML Interpretation for details. If the SCXML session was triggered as the result by an <invoke> element in another session, the SCXML processor MUST generate the event done.invoke. id after termination and return it to the other session, where id is the unique identifier generated when the <invoke> element was executed. See 6.4 <invoke> for details.

3.8 <onentry>

A wrapper element containing executable content to be executed when the state is entered.

The SCXML processsor processor MUST execute this content right after the containing <onentry> handlers of a state has been in document order when the state is entered. In doing so, it MUST treat each handler as a separate block of executable content. See B A Algorithm for SCXML Interpretation for details.

3.9 <onexit>

A wrapper element containing executable content to be executed before when the state is exited.

The SCXML processsor processor MUST execute this content right before the containing <onexit> handlers of a state in document order when the state is exited. In doing so, it MUST treat each handler as a separate block of executable content. See B A Algorithm for SCXML Interpretation for details.

3.10 <history>

The <history> pseudo-state allows allows a state machine to remember its state configuration. Whenever a complex <state> or <parallel> element is exited, its <history> pseudo-state(s), if present, record the state configuration at exit. Later a A <transition> taking the <history> state as its target will return the state machine to this recorded configuration. In effect, this allows the <state> to remember where it was. The 'type' attribute determines how much of the state configuration is recorded. If its value is "shallow", the <history> pseudo-state records only the immediate child state(s) of the parent state. Thus, if the state containing the <history> state is a compound state, the history value will be a single state. However, if the parent state is a <parallel> state, the history value will be a set of states, one for each parallel child region. If 'type' is set to "deep", the history value consists of all active atomic states that are descendants of the parent state. In effect, a "shallow" history state allows the parent state to restart the child state(s) that were active when it was last exited, without regard to where it was within that child state, while "deep" history allows the state to restart exactly where it was when it was last exited. Note that a given state may have both "deep" and "shallow" history states. See B Algorithm for SCXML Interpretation for details.

3.10.2 Children

If the 'type' of a <history> element is "shallow", the SCXML processor MUST record the immediately active children of its parent before taking any transition that exits the parent. If the 'type' of a <history> element is "deep", the SCXML processor MUST record the active atomic descendents of the parent before taking any transition that exits the parent. Before the parent state has been visited for the first time, the SCXML processor MUST treat the default history configuration, which is specified by the 'target' of the <history> element's <transition> child, as if it were the stored configuration. If a <parallel> state, then this transition MAY is executed that takes the <history> state as its target, the SCXML processor MUST specify multiple targets (each MUST be behave as if the transition had taken the stored state configuration as its target. (Note that in a distinct parallel child state). Occurs once. conformant SCXML document, a <state> or <parallel> element MAY have both "deep" and "shallow" <history> children.)

3.11 Legal State Configurations and Specifications

[ Definition : A <state> or <parallel> element is active if it has been entered by a transition and has not subsequently been exited.]

[ Definition : The state configuration of a state machine is the set of currently active states. ]

An SCXML document places the state machine in an initial state configuration at initialization time (via the 'initial' attribute of the <scxml> element). Each transition that the state machine takes thereafter places the state machine in another state configuration (which need not be distinct from the former one.) A conformant SCXML document MUST place the state machine only in legal state configurations, where a legal state configuration is one that meets the following conditions:

  • The configuration contains exactly one child of the <scxml> element.
  • The configuration contains one or more atomic states.
  • When the configuration contains an atomic state, it contains all of its <state> and <parallel> ancestors.
  • When the configuration contains a non-atomic <state>, it contains one and only one of the state's children.
  • If the configuration contains a <parallel> state, it contains all of its children.

It follows from this definition that if a state machine is in more than one atomic state, the atomic states can be traced back through a chain of <state> or >parallel> ancestors to a single <parallel> ancestor.

The 'target' attribute of a <transition> (or the 'initial' attribute of a <state> or <scxml> element) do not in the general case specify a full legal state configuration since 1) they may can contain <parallel> or non-atomic <state> elements 2) they do not contain the ancestors of the states in the list. We therefore define a legal state specification to be a set of states such that 1) no state is an ancestor of any other state on the list, and 2) a full legal state configuration results when all ancestors and default initial descendants have been added. (Note that the process of adding default initial descendants is recursive, since the 'initial' value may itself be non-atomic.) In a conformant SCXML document, the value of an 'initial' attribute or the 'target' of a <transition> MUST either be empty or contain a legal state specification.

In a conformant SCXML document, there is an additional requirement on the value of the 'initial' attribute of a <state> and on the 'target' of a <transition> inside an <initial> element: all the states MUST be descendants of the containing <state> element.

3.12 SCXML Events

Events are one of the basic concepts in SCXML since they drive most transitions. The internal structure of events is platform-specific as long as the following external interface is observed:

For the most part, the set of events raised during the execution of an SCXML document is application-specific and generated under author control by use of the <raise> and <send> elements. However, certain events are mandatory and generated automatically by the interpreter. In this version of the specification, in addition to error events (see 3.13 Errors ), there These are done.state. id (see 3.7 <final> ), cancel.send. id (see 6.3 <cancel> ), done.invoke. id and cancel.invoke. id (see described in 6.4 <invoke> 3.12 SCXML Events ). . Platforms MAY extend the names of these automatically generated events by adding a suffix. For example, a platform could extend done.state. id with a timestamp suffix and generate done.state. id.timestamp instead. Because any prefix of done.state. id is also a prefix of done.state. id.timestamp , any transition that matches the former event will also match the latter.

3.12.1 Event Descriptors

Like an event name, an event descriptor is a series of alphanumeric characters segemented into tokens by the "." character. The 'event' attribute of a transition consists of one or more such event descriptors separated by spaces.

[ Definition : A transition matches an event if at least one of its event descriptors matches the event's name. ]

[ Definition : An event descriptor matches an event name if its string of tokens is an exact match or a prefix of the set of tokens in the event's name. In all case, cases, the token matching is case sensitive. ]

For example, a transition with an 'event' attribute of "error foo" will match event names "error", "error.send", "error.send.failed", etc. (or "foo", "foo.bar" etc.) but would not match events named "errors.my.custom", "errorhandler.mistake","errOr.send" or "foobar".

For compatibility with CCXML, and to make the prefix matching possibly more clear to a reader of the SCXML document, an event descriptor MAY also end with the wildcard '.*', which matches zero or more tokens at the end of the processed event's name. Note that a transition with 'event' of "error", one with "error.", and one with "error.*" are functionally equivalent since they are token prefixes of exactly the same set of event names.

An event designator consisting solely of "*" can be used as a wildcard matching any sequence of tokens, and thus any event. Note that this is different from a transition lacking the 'event' attribute altogether. Such an eventless transition does not match any event, but will be taken whenever its 'cond' attribute evaluates to 'true'. As shown in B A Algorithm for SCXML Interpretation , the SCXML interpreter will check for such eventless transitions when it first enters a state, before it looks for transitions driven by internal or external events.

3.13 3.12.2 Errors There are two general classes of errors that can occur when processing an SCXML document. The first are syntactic errors. A conformant SCXML document is one that obeys all the syntactic restrictions defined in this specification. When an SCXML processor attempts to load and initialize an SCXML document that contains syntactic errors, it MUST reject the document and SHOULD signal an error to the entity that requested the execution of the document. The means of signalling such syntactic errors are platform-specific and outside the scope of this specification, but it is important to note that the SCXML processor will never execute an ill-formed document. In particular, it will never enter the initial states of such a document.

Once the SCXML processor has begun executing a well-formed SCXML document, it MUST signal any errors that arise will be signaled occur by raising SCXML events whose names begin with 'error.'. These the processor MUST place these events will be placed in the internal event queue and and processed MUST process them like any other event. In (Note in particular, they are not processed immediately if there are other events in the queue and they are ignored if no transition is found that matches them. them.) Two error events are defined in this specification: 'error.communication' and 'error.execution'. The former cover errors occuring occurring while trying to communicate with external entities, such as those arising from <send> and <invoke>, while the latter category consists of errors internal to the execution of the script, document, such as those arising from expression evaluation.

The set of error events may be extended in future versions of this specification. However, the set of names beginning with 'error.platform' is reserved for platform- and application-specific errors. Therefore applications and platforms may MAY extend the set of errors defined in this specification in two ways. First by adding a suffix to an error name defined in this specification, and second by using 'error.platform' with or without a suffix. In addition, platforms may MAY include additional information about the nature of the error in the 'data' field of the event. See 5.11 System Variables for details.

Note however that authors can arrange for otherwise unhandled errors to cause the interpreter to exit by creating a transition with "event" attribute of 'error' and a target of any top-level final state (i.e. one that is a child of <scxml>). If such a transition T is placed in a state S, it will cause the state machine to terminate on any error that is raised in S or one of its substates and is not handled by another transition that is placed in a substate of S or in S and preceding T in document order.

3.13 Selecting and Executing Transitions

To simplify the following definitions, we introduce the event NULL. NULL has no name and is used only in these definitions. It nevers occurs in the event queues of an SCXML Processor. All other events have names and are distinct from NULL. (In effect, NULL is a pseudo-event that is used in these definitions as a trigger for eventless transitions.)

[ Definition : A transition T is enabled by named event E in atomic state S if a) T's source state is S or an ancestor of S, b) T matches E's name (see 3.12.1 Event Descriptors ) c) T lacks a 'cond' attribute or its 'cond' attribute evaluates to "true". A transition is enabled by NULL in atomic state S if a) T lacks an 'event' attribute b) T's source state is S or an ancestor of S c) T lacks an 'cond' attribute or its 'cond' attribute evaluates to "true". (Note that such a transition can never be enabled by any named event.)]

[ Definition : A transition T is optimally enabled by event E in atomic state S if a) T is enabled by E in S and b) no transition that precedes T in document order in T's source state is enabled by E in S and c) no transition is enabled by E in S in any descendent of T's source state.]

[ Definition : The optimal transition set enabled by event E in state configuration C is the largest set of transitions such that each transition in the set is optimally enabled by E in an atomic state in C and no transition has a source state that is exited by another transition in the set that proceeds it in document order. ]

[ Definition : The source state of a transition is the <state> or <parallel> element that it occurs in. The target state(s) of the transition is the state or set of states specified by its 'target' attribute. The complete target set of a transition consists of all the states that will be active after the transition is taken. It contains the target states of the transition plus all their ancestors, expanded by the recursive application of the following two operations: 1) if any <parallel> element is a member of the set, any of its children that are not members of the set must be added 2) if any compound <state> is in the set and none of its children is in the set, its default initial state is added to the set. Any state whose child(ren) are added to the complete target set by clause 2 is called a default entry state .]

[ Definition : The exit set of a transition is the set of states that are exited when the transition is taken. If the transition does not contain a 'target', its exit set is empty. Otherwise (i.e., if the transition contains a 'target'), if it 'type' of "external", its exit set consists of all active states that are proper descendents of the Least Common Ancestor (LCA) of the source and target states. Otherwise, if the transition has 'type' "internal" and all its target states are proper descendents of its source state, the target set consists of all active states that are proper descendents of its source state. (If a transition has 'type' of "internal", but its target states are not all proper descendents of its source state, its exit set is defined as if it had 'type' of "external". The exit set of a set of transitions is the union of the exit sets of the individual transitions. ]

[ Definition : The entry set of a transition is the set of states that are entered when the transition is taken. If a transition does not contain a 'target', its entry set is empty. Otherwise, it consists of all members of the transitions complete target set that are not currently active. The entry set of a set of transitions is the union of the transition sets of the individual transitions.]

[ Definition : A microstep consists of the execution of the transitions in an optimal enabled transition set.]

[ Definition : A macrostep is a series of one or more microsteps ending in a configuration where the internal event queue is empty and no transitions are enabled by NULL. ]

To execute a microstep, the SCXML Processor MUST execute the transitions in the corresponding optimal enabled transition To execute a set of transitions, the SCXML Processor MUST first exit all the states in the transitions' exit set in exit order .It MUST then execute the executable content contained in the transitions in document order. It MUST then enter the states in the transitions' entry set in entry order .

To exit a state, the SCXML Processor MUST execute the executable content in the state's <onexit> handler. Then it MUST cancel any ongoing invocations that were triggered by that state. Finally, the Processor MUST remove the state from the active state's list.

To enter a state, the SCXML Processor MUST add the state to the active state's list. Then it MUST execute the executable content in the state's <onentry> handler. If the state is a default entry state and has an <initial> child, the SCXML Processor MUST then execute the executable content in the <initial> child's <transition>.

At startup, the SCXML Processor MUST place the state machine in the configuration specified by the 'initial' attribute of the <scxml> element.

After entering the initial configuration, and after executing each microstep, the SCXML Processor MUST check the state configuration for <final> states that it has entered during the microstep. If it has entered a <final> state that is a child of <scxml>, it MUST halt processing. If it has entered a <final> state that is a child of a compound state, it MUST generate the event done.state. id ,where id is the id of the compound state. If the compound state is itself the child of a <parallel> element, and all the <parallel> element's other children are in final states, the Processor MUST generate the event done.state. id ,where id is the id of the <parallel> elements.

After checking the state configuration, the Processor MUST select the optimal transition set enabled by NULL in the current configuration. If the set is not empty, it MUST execute it as a microstep. If the set is empty, the Processor MUST remove events from the internal event queue until the queue is empty or it finds an event that enables a non-empty optimal transition set in the current configuration. If it finds such a set, the processor MUST then execute it as a microstep. (Otherwise the internal event queue is empty and the Processor has completed a macrostep.)

After completing a macrostep, the SCXML Processor MUST execute in document order the <invoke> handlers in all states that have been entered since the completion of the last macrostep. Then the Processor MUST remove events from the external event queue, waiting till events appear if necessary, until it finds one that enables a non-empty optimal transition set in the current configuration. The Processor MUST then execute that set as a microstep.

See A Algorithm for SCXML Interpretation for more details.

4 Executable Content

4.3 <if>

<if> is a container for conditionally executed elements. <elseif> and <else> are optional immediate children of <if>. They have no content and serve to partition the executuable content elements within the <if>. Each partition within an <if> is preceded by an element having a "cond" attribute. The initial partition is preceded by the <if> and subsequent partitions by <elseif> or <else>. The SCXML processor MUST execute the first partition in document order with a "cond" that evaluates to true. If an <if> has no immediate <elseif> or <else> children, it creates a single partition which will be executed if the "cond" attribute evaluates to true. A partition MAY be empty. <else> is equivalent to an <elseif > element whose "cond" always evaluates to true. In a conformant SCXML document, <else> MUST occur after all <elseif> tags. Here is an example:

<if cond="cond1"> <!-- selected when "cond1" is true --> <elseif cond="cond2"/> <!-- selected when "cond1" is false and "cond2" is true --> <elseif cond="cond3"/> <!-- selected when "cond1" and "cond2" are false and "cond3" is true --> <else/> <!-- selected when "cond1", "cond2", and "cond3" are false --> </if>

4.3.2 Children

The behavior of <if> is defined in terms of partitions of executable content. The first partition consists of the executable content between the <if> and the first <elseif>, <else> or </if> tag. Each <elseif> tag defines a partition that extends from it to the next <elseif>, <else> or </if> tag. The <else> tag defines a partition that extends from it to the closing </if> tag. In a conformant SCXML document, a partition MAY be empty. In a conformant SCXML document, <else> MUST occur after all <elseif> tags.

When the <if> element is executed, the SCXML processor MUST execute the first partition in document order that is defined by a tag whose 'cond' attribute evaluates to true, if there is one. Otherwise, it MUST execute the partition defined by the <else> tag, if there is one. Otherwise it MUST NOT execute any of the executable content.

Here is an example:

<if cond="cond1">
  <!-- selected when "cond1" is true -->
<elseif cond="cond2"/>
  <!-- selected when "cond1" is false and "cond2" is true -->
<elseif cond="cond3"/>
  <!-- selected when "cond1" and "cond2" are false and "cond3" is true -->
<else/>
  <!-- selected when "cond1", "cond2", and "cond3" are false -->
</if>
           

4.4 <elseif>

4.6 <foreach>

4.5 <else>

The SCXML processor MUST declare a new variable if the one specified by 'item' is equivalent not already defined. If 'index' is present, the SCXML processor MUST declare a new variable if the one specified by 'index' is not already defined. If 'array' does not evaluate to an <elseif> with a "cond" legal iterable collection, or if 'item' does not specify a legal variable name, the SCXML processor MUST terminate execution of the <foreach> element and the block that always evaluates to true. contains it, and place the error error.execution on the internal event queue.

The SCXML ptocessor processor MUST execute start with the first item in the executable content collection and proceed to the last item in an <else>'s partition the iteration order that is defined for the collection. (This order depends on the data model in use. ) For each item, the processor MUST act as if it has made a shallow copy or reference and only if all preceding "cond"s evaluate assign it to false. In the item variable. (Note that the assigned value MAY be null or undefined if the collection contains a conformant null or undefined item.) After making the assignment, the SCXML document <else> processor MUST evaluate its child executable content. It MUST occur after all <elseif> partitions. 4.5.2 Attribute Details None. then proceed to the next item in iteration order. If the evaluation of any child element causes an error, the processor MUST cease execution of the <foreach> element and the block that contains it. (Note that SCXML does not provide break functionality to interrupt <foreach>, however targetless and/or eventless transitions can provide sophisticated iterative behavior within the SCXML application itself.)

4.7 4.8 Other Executable Content

The following elements of executable content are defined elsewhere in this specification. They MAY occur wherever executable content is allowed and MUST NOT occur anyplace else.

4.8 4.9 Evaluation of Executable Content

Wherever executable content is permitted, an arbitrary number of elements MAY occur. Such a sequence of elements of executable content is called a block. For example, if transition t takes the state machine from atomic state S1 to atomic state S2, there are three blocks of executable content executed: the one in the <onexit> handler of S1, the one inside t, and the one inside the <onentry> handler of S2. The SCXML processor MUST execute the elements of a block in document order. If the processing of an element causes an error to be raised, the processor MUST NOT process the remaining elements of the block. (The execution of other blocks of executable content is not affected.) The SCXML processor MUST execute the <onexit> handlers of states exited by a transition in exitorder . The SCXML processor MUST execute executable content that is contained in the transition after the <onexit> handlers of the states being exited, and before the <onentry> handlers of the states being entered. The SCXML processor MUST execute the <onentry> handlers of states entered by a transition in entry order . (Note that targetless transitions do not exit and re-enter their source state, so only the executable content in the transition is executed. See 3.4.3 Selecting and Executing Transitions for details.)

Events raised during the processing of executable content are treated like any other events. Note in particular, that error events will not be removed from the queue and processed until all events preceding them in the queue have been processed. See 3.13 3.12.2 Errors and B A Algorithm for SCXML Interpretation for details.

4.9 4.10 Extensibility of Executable Content

Implementations MAY may provide additional executable content corresponding to special features of their implementations. The functionality of such platform-specific content is not restricted, except that it MUST NOT cause transitions or any form of change of state (except indirectly, by raising events that trigger transitions). Note that SCXML treats the executable content triggered by a transition as a single blocking operation and that no events are processed until all the executable content has completed. For example, when taking a transition into state S, the SCXML processor will not process any events or take any transitions until all <onentry> handlers in S have finished. It is thus important that all executable content, including platform-specific extensions, execute swiftly.

In a conformant SCXML document any extensions to executable content MUST NOT be defined the 'scxml' namespace. (Note that the schema C Schemas B Schema allows elements from arbitrary namespaces inside blocks of executable content.) The following example shows the incorporation of CCXML functionality (see [W3C CCXML 1.0] ) into SCXML. In particular an <accept> element in the 'ccxml' namespace is invoked as executable content inside a transition.

<transition event="ccxml:connection.alerting">
  <ccxml:accept connectionid="_event.data.connectionid"/>
</transition>

This markup is legal on any SCXML interpreter, but the behavior of <accept> element is platform-dependent. See D.2 C.2 Conforming Processors for details.

A general method for implementing extensions using the <send> element is presented in H.7 G.8 Custom Action Elements .

5 Data Model and Data Manipulation

5.1 Introduction

[This section is informative.]

The Data Model offers the capability of storing, reading, and modifying a set of data that is internal to the state machine. This specification does not mandate any specific data model, but instead defines a set of abstract capabilities that can be realized by various languages, such as ECMAScript or XML/XPath. Implementations may choose the set of data models that they support. In addition to the underlying data structure, the data model defines a set of expression as described in 5.10 Expressions . These expressions are used to refer to specific locations in the data model, to compute values to assign to those locations, and to evaluate boolean conditions. Finally, the data model includes a set of system variables, as defined in 5.11 System Variables , which are automatically maintained by the SCXML processor.

The data model is defined via the 5.2 <datamodel> element, which contains zero or more 5.3 <data> elements, each of which defines a single data element and assigns an initial value to it. These values may be specified in-line or loaded from an external source. They can then be updated via the 5.4 <assign> element. The 5.5 <validate> element can be used to validate the data (in data models where that makes sense), while the 5.6 <donedata> , 5.7 <content> , and 5.8 <param> elements can be used to incorporate data into communications with external entities. Finally, the 5.9 <script> element permits the incorporation of a scripting language.

The interpretation of these elements depends on the datamodel in question, and not all elements are supported in all datamodels. For the details of specific data models, see E D Data Models .

5.3 <data>

The <data> element is used to declare and populate portions of the datamodel.

5.3.3 Data Binding and Scoping

There is a single globally visible data model for the entire state machine and machine. Specifically, the SCXML processor MUST allow any data element to be accessed from any state. Thus the data model has no concept of scoping. However, authors control when the initial values are assigned to the data elements by means of the 'binding' attribute on the <scxml> element. When 'binding' is assigned the value "early" (the default), the scxml processor MUST create all data elements and assign their initial values at document initialization time. When 'binding' is assigned the value "late", the scxml processor MUST create the data elements at document initialization time, but MUST assign the initial value specified by 'expr' to a given data element only when the state that contains it is entered for the first time, before any <onentry> markup. (The value of the data element between the time it is created and the time its parent state is first entered will depend on the data language chosen.) chosen. The value specified by 'expr' will be assigned to the data element even if the element already has a non-null value when the parent state is first entered.)

Ordering dependencies between <data> elements are not permitted. In the case of early binding, the scxml processor MUST evaluate all <data> elements at initialization time but MAY do so in any order it chooses. Suppose, for example, that the declaration of element "a" precedes the declaration of element "b" in a document. It is not safe to assume that "a" will be instantiated and have a value when the declaration of "b" is executed. Therefore the "expr" in "b" cannot safely reference the value of "a" (and vice-versa). When late binding is selected, the scxml processor MUST create data model elements at initialization time but MAY do so in any order it chooses. Similarly, the processor MUST assign the initial value specified by 'expr' to data elements only when the state containing them is first entered, but MAY do so in any order it chooses.

Values created by <data> elements are local to their session. In particular, the scxml processor MUST insure that such values are changed only by the execution of executable content or the <finalize> element. Note that in addition to the author-controlled <data> elements there are system variables whose values are maintained by the scxml processor. See 5.11 System Variables for details.

5.4 <assign>

The <assign> element is used to modify the data model.

A conformant SCXML document MUST specify either "expr" or children of <assign>, but not both.

Assignment to a data model is done by using a location expression to denote the part of the data model where the change insertion is to be made. If the location expression does not denote a valid location in the datamodel or if the value specified ( by 'expr' or children) is not a legal value for the location specified, the processor MUST place the error error.execution in the internal event queue. Otherwise, the processor MUST place the specified value at the specified location. Note that what constitutes the nature of the insertion and the definition of a legal value depends on the data model language used. Note also that datamodels MAY additional attributes for <assign> beyond those specified here. See E D Data Models for details.

5.6 <donedata>

A wrapper element holding data to be returned when a <final> state is entered. In cases where the SCXML processor generates a 'done' event upon entry into the final state, it MUST place the data specified by this element in the _event.data field, but exact format of that data will be determined by the datamodel (see E Data Models for details). In other cases (namely when the <final> element is a child of <scxml> and the state machine has not been triggered by <invoke>), the SCXML processor SHOULD return the data to the environment in an implementation-dependent manner.

5.6.2 Children

A conformant SCXML document MUST specify either a single <content> element or one or more <param> elements as children of <donedata>, but not both. .

In cases where the SCXML processor generates a 'done' event upon entry into the final state, it MUST place the data specified by this element in the _event.data field, but exact format of that data will be determined by the datamodel (see D Data Models for details). In other cases (namely when the <final> element is a child of <scxml> and the state machine has not been triggered by <invoke>), the SCXML processor SHOULD return the data to the environment in an implementation-dependent manner.

5.9 <script>

The Script Module <script> element adds scripting capability to the state machine. A <script> element that is a child of <scxml> is evaluated at document load time. All other <script> elements are evaluated as part of normal executable content evaluation. The name of any script variable may be used as a location expression (see 5.10.2 Location Expressions ). For an example of a data model incorporating scripting, see E.2 The ECMAScript Data Model .

A conformant SCXML document MUST specify either the 'src' attribute or child content, but not both. If 'src' is specified, the SCXML Processor MUST download the script is downloaded from the specified location at load time. If the script can not be downloaded within a platform-specific timeout interval, the document is considered non-conformant, and the platform MUST reject it.

The SCXML Processor MUST evaluate any <script> element that is a child of <scxml> at document load time. It MUST evaluate all other <script> elements as part of normal executable content evaluation.

In a conformant SCXML document, the name of any script variable MAY be used as a location expression (see 5.10.2 Location Expressions ).

For an example of a data model incorporating scripting, see D.2 The ECMAScript Data Model .

5.10 Expressions

SCXML contains three types of expressions, as described below. Different datamodels will support different languages for these expression types, but certain properties of the expressions are constant across languages and are defined here.

The SCXML processor MUST insure that expressions do not contain side effects that would effect the datamodel or the execution of the state machine. The SCXML processor MAY optimize expression evaluation. Thus the SCXML processor MAY not evaluate expressions as often as indicated in B A Algorithm for SCXML Interpretation or at the same points in the algorithm.

When "late" data binding is used, accessing data substructure in expressions before the corresponding <data> element is loaded yields MUST yield the same execution-time behavior as accessing non-existent data substructure in a loaded <data> instance. Such behavior is defined by the data expression language in use.

5.10.2 Location Expressions

Location expressions are used to specify a location in the datamodel as part of the <assign>element. The exact nature of a location depends on the datamodel. For example, in the XPath datamodel ( E.3 D.3 The XPath Data Model ), the underlying data structure is an XML tree and a location expression must evaluate to an the set of valid locations consists of the existing node or nodeset nodes and nodesets in the tree. If a location expression does not evaluate cannot be evaluated to yield a legal valid location, the SCXML processor MUST place the error error.execution in the internal event queue.

5.10.3 Legal Data Values and Value Expressions

Any A data model MUST specify definition contains a specification of the underlying data structure. For example, the XPath datamodel ( E.3 D.3 The XPath Data Model ) defines the data structure to be an XML tree. Such a specification of the data structure implicitly defines a set of "legal data values", namely the objects that can be part of such a data structure. For an XML data model, the set of legal data values consists of XML trees and subtrees, plus strings (as values of attributes or text children). In conjunction with this, the datamodel MUST define definition specifies a set of value expressions which can be evaluated at runtime to return legal data values. If a value expression does not return a legal data value, the SCXML processor MUST place the error error.execution in the internal event queue.

5.11 System Variables

The Data Module maintains SCXML Processor MUST maintain a protected portion of the data model containing information that may can be useful to applications. We refer to the items in this special part of the data model as 'system variables'. Implementations MUST provide the following system variables, and MAY support others.

  • _event . The SCXML Processor MUST use the variable '_event' is bound to hold a structure containing the current event's name and any data contained in the event (see 5.11.1 The Internal Structure of Events . The exact nature of the structure depends on the datamodel being used. See E D Data Models for details. The Processor MUST bind the _event variable is bound when an event is pulled off the internal or external event queue to be processed, and remains MUST keep the variable bound to that event until another event is processed. When (It follows that when an application is testing the 'cond' attribute of a <transition> element that contains an 'event' attribute, _event will always be bound to the event that the transition is being matched against. If the transition is selected to be executed, _event will remain bound to that event in the <onexit> handlers of the states being exited, the executable content of the transition itself, and the <onentry> handlers of the states being entered. In the case of <transition> elements that do not contain an 'event' attribute and the <onexit> and <onentry> handlers of any states that are exited or entered by such transitions, the _event variable will not have a predictable value since the transition is not being driven by an event. In these cases, _event will be bound to the last event that triggered was matched against a transition. transition.) The SCXML Processor MUST NOT bind _event at initialization time until the first event is processed. Hence _event is unbound when the state machine starts up, and is not bound until an event is processed. up. See B A Algorithm for SCXML Interpretation for details. If the data in the event is not a legal instance of the data model language, and the system Processor cannot translate it into one, then the Processor MUST place the error error.execution in the internal event queue at the point at which the system it attempts to bind _event, _event. In this case, the error error.ececution will be raised and Processor MUST leave the event data part of the _event structure will not be bound. The unbound. (Note that the event's name will still be available, however. Processing however and that processing of both the original event and the error event will proceed as usual. usual.)
  • _sessionid . The Processor MUST bind the variable _sessionid is bound at load time to the system-generated id for the current SCXML session, which will be session. (This is of of type NMTOKEN. It remains NMTOKEN.) The Processor MUST keep the variable bound to this value until the session terminates.
  • _name . The Processor MUST bind the variable _name is bound at load time to the name value of the state machine, which is specified in the "name" 'name' attribute of the <scxml> element. It remains The Processor MUST keep the variable bound to this value until the session terminates.
  • _ioprocessors .The Processor MUST bind the variable _ioprocessors to a set of values, one for each Event I/O Processor that it supports. The value associated with each I/O Processor gives an address that external entities can use to communicate with this SCXML session using that Event I/O Processor. The underlying data structure and the syntax to access it depend on the data model. See D Data Models for details. The nature of the values associated with the individual Event I/O Processors depends on the Event I/O Processor in question. See E Event I/O Processors for details. The Processor MUST keep the variable bound to this set of values until the session terminates.
  • _x . The variable _x is the root element for platform-specific system variables. Any platform-specific system variables The Processor MUST be created place all platform-specific system variables underneath it. The exact structure of the platform-specific variables depends on the data model. For example, in the ECMAScript datamodel E.2 D.2 The ECMAScript Data Model , '_x' will be a top-level ECMAScript object and the platform-specific system variables will be its properties.

The set of system variables may be expanded in future versions of this specification. Variable names beginning with '_' are reserved for system use. Developers A conformant SCXML document MUST NOT use contain ids beginning with '_' in the <data> element. Platforms MUST place all platform-specific system variables under the '_x' root.

The concrete realization of these variables in a specific data model depends on the language used. For the exact location of these variables in an XML data model, see E.3 D.3 The XPath Data Model . All system variables are protected and The Processor MUST cause any attempt to change their values the value of a system variable to fail and MUST fail and result in place the error error.illegalassign being raised. error.execution on the internal event queue when such an attempt is made.

5.11.1 The Internal Structure of Events

Events have an internal structure which will be is reflected in the _event variable. This variable can be accessed to condition transitions (via boolean expressions in the 'cond' attribute) or to update the datamodel (via <assign>), etc. It is the responsibility of the SCXML platform that receives the events to fill in these fields appropriately. Platforms SHOULD convert data received from external entities into their local datamodel language if possible. If the conversion is not possible, platforms MAY ignore the event or signal an error.

The SCXML Processor MUST insure that the following fields are present in all events, whether internal or external.

  • name . This is a character string giving the name of the event. It is what is matched against the 'event' attribute of <transition>. Note that transitions can do additional tests by using the value of this field inside boolean expressions in the 'cond' attribute.
  • type . This field describes the event type. It The SCXML Processor MUST contain one of an enumerated set of string values consisting of: it to: "platform" (for events raised by the platform itself, such as error events), "internal" (for events raised by <raise> and <send> with target '_internal') and or "external" (for all other events).
  • sendid . In the case of error events triggered by a failed attempt to send an event, the Processor MUST set this field will contain to the send id of the triggering <send> element. Otherwise it will be MUST leave it blank.
  • The following fields are logically present in all events, but will be filled in only in external events:
  • origin . This a URI, equivalent to the 'target' attribute on the <send> element. The combination of If this field with event was received from an external entity, the 'origintype' field SCXML Processor SHOULD set this field to a value which, in combination with the "origintype" field, will allow the receiver of the event to <send> a response back to the entity that originated originating entity. Otherwise, the Processor MUST leave this event. field blank.
  • origintype . This is a character string, similar to If this event was received from an external entity, the 'type' attribute in <send> he combination of SCXML Processor SHOULD set this field to a value which, in combination with the 'origin' field SHOULD field, will allow the receiver of the event to <send> a response back to the entity that originated originating entity. Otherwise, the Processor MUST leave this event. field blank.
  • invokeid . If this event is generated from an invoked child process, the Processor MUST set this field will contain to the invoke id of the invocation that triggered the child process. Otherwise it will be MUST leave it blank.
  • data . This field contains whatever data the sending entity chose to include in this event. The receiving platform SCXML Processor SHOULD reformat this data to match its data model, but MUST NOT not otherwise modify it. If the conversion is not possible, the Processor MUST leave the field blank and MAY place an error in the internal event queue.

6 External Communications

6.1 Introduction

[This section is informative.]

The External Communications capability allows an SCXML session to send and receive events from external entities, and to invoke external services. 6.2 <send> provides "fire and forget" capability to deliver events and data to any destination, including other SCXML sessions. The 'delay' attribute allows for deferred event delivery and can be used to implement a timer. The details of event transport as well as the format of the event and data are determined by the Event I/O Processor selected. Each implementation will support one or more such processor, and the author of the SCXML markup can choose the one that is appropriate for the type of endpoint he is trying to reach.

6.4 <invoke> offers a more tightly coupled form of communication, specifically the ability to trigger a platform-defined service and pass data to it. It and its child <finalize> are useful in states that model the behavior of an external service. The <invoke> element is executed after the state's <onentry> element and causes an instance of the external service to be created. The <param> and <content> elements and the 'namelist' attribute can be used to pass data to the service. Any events that are received by the state machine from the invoked component during the invocation are preprocessed by the <finalize> handler before transitions are selected. The <finalize> code is used to normalize the form of the returned data and to update the data model before the transitions' "event" and "cond" clauses are evaluated.

When parallel states invoke the same external service concurrently, separate instances of the external service will generate be started. They can be distinguished by ids which are associated with them. Similarly, the ids contained in the events returned from the external services can be used to determine which events are responses to which invocation. Each event that is returned will be processed only by the <finalize> in the state that invoked it, but that event is then processed like any other event that the state machine receives. The finalize code can thus be thought of as a 'done' preprocessing stage that applies before the event is added to the event queue. Note that the event when it completes and, conversely, will be terminated automatically if passed to all parallel states to check for transitions.

Since an invocation will be canceled when the state machine leaves the invoking state, it does not make sense to start an invocation in a state containing that will be exited immediately. Therefore the <invoke> tag. Events element is executed upon entry into the state, but only after checking for eventless transitions and transitions driven by pending internal events. If any such enabled transition is found , it is taken and data returned from the invoked service can be pre-processed with state is exited immediately, without triggering the invocation. Thus invocations are triggered only when the state machine has reached a stable configuration, i.e., one that it will be staying in while it waits for external events. (See 6.5 <finalize> A Algorithm for SCXML Interpretation element. for details.)

6.2 <send>

6.2.2 Attribute Details

hints false May not occur with 'hintsexpr'. string none The string contains information which may be used by the implementing platform to optimize message transmission. The meaning of these hints is platform-specific. hintsexpr false May not occur with 'hints' Value expression none A value expression. A dynamic alternative to 'hints'. 'hints' is a static string, while 'hintsexpr' is evaluated at runtime and is treated as if it were the value of 'hints'.
Name Required Attribute Constraints Type Default Value Valid Values Description
event false May Must not occur with 'eventexpr'. If the type is 'scxml', either this attribute or 'eventexpr' must be present. string EventType.datatype none A string indicating the type name of message being generated. The string may include alphanumeric characters and the "." (dot) character. The first character may not be a dot or a digit. Message type names are case-insensitive. A conformant SCXML document must specify either 'event', 'eventexpr' or in-line content. A conformant document may not specify 'event' in conjunction with See B Schema for details on the inline content. data type.
eventexpr false May Must not occur with 'event'. If the type is 'scxml' 'scxml', either this attribute or 'event' must be present. Value expression none A dynamic alternative to 'event'. 'event' If this attribute is a static string, while 'eventexpr' present, the SCXML Processor MUST evaluate it when the parent <send> element is evaluated at runtime and is treated treat the result as if it were had been entered as the value of 'event'.
target false May Must not occur with 'targetexpr' URI none A valid target URI The unique identifier of the message target that the platform should send the event to. See 6.2.4 The Target of Send for details.
targetexpr false May Must not occur with 'target' Value expression none An expression evaluating to a valid target URI A dynamic alternative to 'target'. 'target' If this attribute is a static string, while 'targetexpr' present, the SCXML Processor MUST evaluate it when the parent <send> element is evaluated at runtime and is treated treat the result as if it were had been entered as the value of 'target'.
type false May Must not occur with 'typeexpr' string none A token that specifies the transport mechanism for the message. See 6.2.5 The Type of Send for details.
typeexpr false May Must not occur with 'type' value expression none A dynamic alternative to 'type'. 'type' If this attribute is a static string, while 'typeexpr' present, the SCXML Processor MUST evaluate it when the parent <send> element is evaluated at runtime and is treated treat the result as if it were had been entered as the value of 'type'.
id false This attribute may Must not occur with 'idlocation'. ID xml:ID none Any valid token A string literal to be used as the identifier for this instance of <send>. See 3.14 IDs for details.
idlocation false This attribute may Must not occur with 'id'. Location expression none Any valid location expression Any location expression evaluating to a data model location. location in which a system-generated id can be stored. See 5.10.2 Location Expressions below for details. If the 'id' attribute is not specified, the platform will store the id that it generates automatically in this location. See 3.14 IDs for details.
delay false May Must not occur with 'delayexpr' or when the attribute 'target' has the value "_internal". string Duration.datatype None A time designation as defined in CSS2 [CSS2] format The character string is interpreted as a time interval. The send tag will return immediately, but the message is not dispatched until the delay interval elapses. In this case, all arguments to send are evaluated when Indicates how long the send element is first processed, and not when processor should wait before dispatching the message is actually dispatched. Timers are useful for a wide variety of programming tasks, and can be implemented using this attribute. Note: The queue message. See B Schema for messages events is maintained locally. Any messages waiting to be sent will be purged when details on the session that issued this request terminates. data type.
delayexpr false May Must not occur with 'delay' or when the attribute 'target' has the value "_internal". Value expression None A value expression which returns a time designation as defined in CSS2 [CSS2] format A dynamic alternative to 'delay'. 'delay' If this attribute is a static string, while 'delayexpr' present, the SCXML Processor MUST evaluate it when the parent <send> element is evaluated at runtime and is treated treat the result as if it were had been entered as the value of 'delay'.
namelist false This attribute may Must not be specified in conjunction with the <content> element. List of location expressions none List of data model locations A space-separated list of zero one or more data model locations to be included with the message. See 5.10.2 Location Expressions for details.

6.2.3 Children

"namelist" and <content> may not co-occur. That is, A conformant SCXML document MUST specify either 'event', 'eventexpr' or in-line content. A conformant document MUST NOT specify 'event' in conjunction with the developer may inline content. A conformant document MUST NOT specify both "namelist" and <content>.

If 'idlocation' is present, the content of SCXML Processor MUST generate an id when the event parent <send> element is evaluated and store it in the following four ways: this location. See 3.14 IDs for details.

The 'namelist'attribute. One

If a delay is specified via 'delay' or more <param> children. 'delayexpr', the SCXML Processor MUST interpret the character string as a time interval. It MUST dispatch the message only when the delay interval elapses. (Note that the evaluation of the send tag will return immediately.) The 'namelist' attribute plus one or more <param> children. A single <content> child. . Processor MUST evaluate all arguments to <send> when the <send> element is evaluated, and not when the message is actually dispatched. If the SCXML session terminates before the delay interval has elapsed, the SCXML Processor MUST discard the message without attempting to deliver it.

6.2.4 The Target of Send

The target of the <send> operation is specifies the destination to which of the event should be sent. It may be event. The target is defined by either the 'target' or the 'targetexpr' attribute. Either one can be used to specify the unique identifier of the target. This may be the identifier of another SCXML session. In other cases most cases, the value format of this attribute will depend the target depends on the type of the target. (For target (for example a SIP URL for SIP-INFO messages or a HTTP URL for Web Services). The In addition, this specification defines the following special values are defined: values, which SCXML Processors MUST support:

If neither the 'target' nor the 'targetexpr' attribute is specified, the SCXML Processor MUST add the event will be added to the external event queue of the sending session. If the value of the 'target' or 'targetexpr' attribute is not supported or invalid, the system will raise an Processor MUST place the error error.execution event. If on the target internal event queue. If it is unreachable by unable to reach the platform, target, the system will raise an Processor MUST place the error error.communication event. on the internal event queue.

6.2.5 The Type of Send

The type of the <send> operation specifies the method that should be used the SCXML processor MUST use to deliver the message to its target. The type may be defined by A conformant SCXML document MAY use either the 'type' or the 'typeexpr' attribute. The type is used in conjunction with the target to determine how to connect attribute to define the destination. The type. If neither the 'type' nor the 'typeexpr' is defined, a the SCXML Processor MUST assume the default value of 'scxml' is assumed. 'scxml. If the SCXML Processor does not support the type specified that is not supported, specified, it MUST place the platform will raise event error.execution on the error internal event error.execution. queue.

A platform must SCXML Processors MUST support the following type:

Value Details
"scxml" Target is an SCXML session. The transport mechanism is platform-specific.

For details on the 'scxml' type, see F.1 E.1 SCXML Event I/O Processor .

Support for HTTP POST is optional, however platforms Processors that support it must use the following value for the "type" attribute:

Value Details
"basichttp" Target is a URL. Data is sent via HTTP POST

For details on the 'basichttp' type, see F.2 E.2 Basic HTTP Event I/O Processor .

Support for DOM event delivery is optional, however platforms Processors that support it must use the following value for the "type" attribute:

Value Details
"DOM" Target is a node in the current document, which may contain markup from multiple namespaces. A DOM event will be targeted at that node.

For details on the 'DOM' type, see F.3 E.3 DOM Event I/O Processor .

Platforms may Processors MAY support other types such as web-services, SIP or basic HTTP GET. However, platforms they SHOULD assign such types names beginning with "x-" to signify that they are platform dependent.

6.2.6 Message Content

The sending SCXML Interpreter MUST not alter the content of the <send> may specify and MUST include it in the message name via that it sends to the optional 'event' attribute. Additional content may be destination specified in one the target attribute of <send>.

Note that the three following document author can specify the message content in one of two mutually exclusive ways:

The sending SCXML Interpreter MUST not alter the content of the <send> and must send all the data contained within the message to the destination specified in the target attribute of <send>. Note that the absence of any error events does not mean that the event was successfully delivered to its target, but only that the platform was able to dispatch the event.

6.4 <invoke>

<invoke> and its child <finalize> are useful in states that model the behavior of an external service. The <invoke> element is executed after the state's <onentry> element and causes an instance of the external service to be created. The <param> <invoke element may be used to pass data to the service. Any events that are received by the state machine from the invoked component during the invocation are preprocessed by the <finalize> handler before transitions are selected. The <finalize> code is used to normalize the form of the returned data and to update the data model before the transitions' "event" and "cond" clauses are evaluated. When the <invoke> element is executed, the platform MUST start a new logical instance of the external service specified in "type" and pass it the data specified by "src", <content>, or <param>. The service create an instance MAY be local or remote. In addition to the explicit arguments, the platform MUST keep track of the unique invoke id and insure that it is included in all events that the invoked service returns to the invoking machine. The external service MAY generate multiple events while it is processing, but once it has finished processing it MUST return a special event 'done.invoke. id ' to the external event queue of the invoking process, where id is the identifier for the corresponding <invoke> element. The external service MUST not generate any other events after this done event. If the invoking state machine takes a transition out of the state containing the <invoke> before it receives the 'done.invoke. id ' event, it MUST automatically cancel the invoked component and stop its processing. The cancel operation MUST act as if it were the final <onexit> handler in the invoking state. When parallel states invoke the same external service concurrently, separate instances of the external service will be started. They can be distinguished by their invokeids which are generated as part of the invocation. Similarly, the invoke id contained in the events returned from the external services can be used to determine which events are responses to which invocation. Each event that is returned will be processed only by the <finalize> in the state that invoked it, but that event is then processed like any other event that the state machine receives. The finalize code can thus be thought of as a preprocessing stage that applies before the event is added to the event queue. Note that the event will be passed to all parallel states to check for transitions. Since an invocation will be canceled when the state machine leaves the invoking state, it does not make sense to start an invocation in a state that will be exited immediately. Therefore the <invoke> element is executed upon entry into the state, but only after checking for eventless transitions and transitions driven by pending internal events. If any such enabled transition is found , it is taken and the state is exited immediately, without triggering the invocation. Thus invocations are triggered only when the state machine has reached a stable configuration, i.e., one that it will be staying in while it waits for external events. (See B Algorithm for SCXML Interpretation for details.) service.

6.4.1 Attribute Details

Name Required Attribute Constraints Type Default Value Valid Values Description
type false May Must not occur with 'typeexpr'. the 'typeexpr' attribute. NMTOKEN none 'scxml', 'vxml2', 'vxml3', 'ccxml', plus other platform-specific values. A string specifying the type of the external service. Platforms MUST support 'scxml' as a value. Platforms MAY support 'vxml2', which indicates a VoiceXML 2.x interpreter, 'vxml3' which indicates a VoiceXML 3.x interpreter, and 'ccxml', which indicates a CCXML 1.0 interpreter. Platforms MAY support additional values, but they SHOULD name the values beginning with "x-" to signify that they are platform dependent. See below for details.
typeexpr false May Must not occur with 'type'. the 'type' attribute. value expression none Any value expression that evaluates to a character string that would be a valid value for 'type'. A dynamic alternative to 'type'. 'type' If this attribute is a static string, while 'typeexpr' present, the SCXML Processor MUST evaluate it when the parent <invoke> element is evaluated at runtime and is treated treat the result as if it were had been entered as the value of 'type'.
src false May Must not occur with the 'srcexpr' attribute or the <content> element. URI None Any URI. A URI that will to be passed to the external service. See 6.4.3 Data Sharing below for details.
srcexpr false May Must not occur with the 'src' attribute or the <content> element. Value expression None Any expression evaluating to a valid URI. A dynamic alternative to 'src'. 'src' If this attribute is a static string, while 'srcexpr' present, the SCXML Processor MUST evaluate it when the parent <invoke> element is evaluated at runtime and is treated treat the result as if it were had been entered as the value of 'src'.
id false May Must not occur with the 'idlocation' attribute. ID none Any valid token A string literal to be used as the identifier for this instance of <invoke>. See 3.14 IDs for details.
idlocation false May Must not occur with the 'id' attribute. Location expression none Any valid location expression Any data model expression evaluating to a data model location. See 5.10.2 Location Expressions for details. If the 'id' attribute is not specified, the platform will store the id that it generates automatically in this location. See 3.14 IDs for details. The automatically generated identifier will have the form stateid.platformid , where stateid is the id of the state containing this element and platformid is an identifier generated by the platform which MUST be unique within the current session.
namelist false May Must not occur with the <param> <content> element. List of location expressions none List of data model locations A space-separated list of zero or more data model locations to be passed to the invoked service. See See 6.4.3 6.4.4 Data Sharing and 5.10.2 Location Expressions for details.
autoforward false boolean false true or false If 'true', any external events received by the state machine will be forwarded automatically to the invoked external service. Note that either the "id" or "idlocation" attribute may be specified, but not both. If the author does not provide an explicit identifier via the "id" attribute, the system will generate one automatically. It will store this identifier in the location specified by "idlocation" if that attribute is present. In the rest of this document, we will refer to this identifier as the "invokeid", regardless of A flag indicating whether it is specified by the author or generated by the platform. When the 'autoforward' attribute is set to true, the invoking process will send an exact copy of every external event it receives forward events to the invoked process. In particular all the fields specified in 5.11.1 The Internal Structure of Events will have the same values in the forwarded copy of the event. The invoking process will forward the event at the point at which it removes it from the external event queue for processing. See B Algorithm for SCXML Interpretation below for details.

6.4.2 Children

At most A conformant SCXML Document MUST NOT specify more than one of "src", 'src', <param>, and <content>may be specified. or <content>. However it MAY specify <param> may occur multiple times if it occurs. times.

6.4.3 Data Sharing

The invoked external resource is logically separate from Platforms MUST support 'scxml' as a value for the state machine that invokes it 'type' attribute. Platforms MAY support 'vxml2', which indicates a VoiceXML 2.x interpreter, 'vxml3' which indicates a VoiceXML 3.x interpreter, and does not share data with it unless 'ccxml', which indicates a CCXML 1.0 interpreter. Platforms MAY support additional values, but they SHOULD name the author explicitly requests this values beginning with the <param> or <content> elements and/or the 'src' and 'namelist' attributes. "x-" to signify that they are platform dependent.

For targets of type 'scxml', 'ccxml', 'vxml2' or 'vxml3',

A conformant SCXML document MAY specify either the <content> element 'id' or 'src' 'idlocation' attribute, but MUST NOT specify both. If the 'idlocation' attribute is used to provide markup that present, the invoked resource should execute. (The <content> SCXML Processor MUST generate an id automatically when the <invoke> element provides is evaluated and store it in the location specified by 'idlocation'. (In the rest of this markup in-line, while document, we will refer to this identifier as the 'src' attribute specifies "invokeid", regardless of whether it via a uri.) Similarly, is specified by the <param> author or generated by the platform). The automatically generated identifier MUST have the form stateid.platformid ,where stateid is the id of the state containing this element and namelist attribute are used to specify values that are to platformid is automatically generated. platformid MUST be injected into unique within the data model of current session.

When the invoked resource. For targets of other types, <invoke> element is executed, the interpretation SCXML Processor MUST start a new logical instance of <param> and <content> elements and the external service specified in 'type' or 'typexpr', passing it the URL specified by 'src' and 'namelist' attributes is platform-specific. However, values or the data specified by <param> and namelist <content>, or <param>. The service instance MAY be local or remote. In addition to the explicit arguments, the Processor MUST be treated identically, as must those provided via 'src' keep track of the unique invokeid and <content> The insure that it is included in all events that the invoked and service returns to the invoking process may also communicate via events. If session.

When the 'autoforward' attribute is set to 'true', true, the invoking state machine will automatically forward a SCXML Processor MUST send an exact copy of all every external events event it receives to the external service. invoked process. All the fields specified in 5.11.1 The invoking machine will send such events at Internal Structure of Events MUST have the same time as it pulls them off values in the external event queue to process them. Once it has forwarded copy of the copy, event. The SCXML Processor MUST forward the invoking state machine will process event at the point at which it removes it from the external event normally, regardless queue of how the invoking session for processing. See A Algorithm for SCXML Interpretation for details.

The external service MAY return multiple events while it is handled processing. If there is a <finalize> handler in the external service. SCXML scripts can also use instance of <invoke> that created the <send> tag To send messages to service that generated the child process on an ad-hoc basis. The type should be set to event, the same value as was used SCXML Processor MUST execute the code in that <finalize> handler right before it removes the original <invoke>, while event from the target should have event queue for processing. It MUST NOT execute the <finalize> handler in any other instance of <invoke>. Once the external service has finished processing it MUST return a special form #_ event 'done.invoke. invokeid , id ' to the external event queue of the invoking process, where invokeid id is the identifier corresponding to invokeid for the original corresponding <invoke> tag. For example, in a document using ECMAScript as the data model, element. The external service MUST NOT generate any other events after this done event. If the following code would invoke invoking session takes a VXML session: <invoke type="vxml" idlocation="myInvoke"/> In this case, transition out of the unique invoke identifier has been stored in state containing the data model location MyInvoke. Since <invoke> before it receives the target attribute is an expression which is evaluated, 'done.invoke. id ' event, the following code will extract that identifier and send a message to SCXML Processor MUST automatically cancel the invoked VXML session: <send type="vxml" targetexpr="'#' + myInvoke"/> Finally, component and stop its processing. The cancel operation MUST act as if it were the final <onexit> handler in the case where invoking state.

Invoked services of type 'scxml', 'ccxml', 'vxml2' or 'vxml3' MUST interpret values specified by the <content> element or 'src' attribute as markup to be executed. Similarly, they MUST interpret values specified by <param> element or 'namelist' attribute as values that are to be injected into their data models. For targets of other invoked external service is an SCXML session, it may use <send> with types, the special target '_parent' interpretation of <param> and <content> elements and type 'scxml' to send events, possibly containing data, to the invoking state machine. 'src' and 'namelist' attributes is platform-specific. However, these services MUST treat values specified by <param> and namelist identically. They MUST also treat values specified by 'src' and <content> identically.

6.4.4 6.4.3 Implementation of <invoke>

The implementation of <invoke>, including communication between parent and child processes, is platform-specific, but the following requirements hold in the case where the invoked process is itself an SCXML session:

6.5 <finalize>

6.5.2 Children 6.5 <finalize>

<finalize>'s children consist of executable content. The content will be <finalize> element enables an invoking session to update its data model with data contained in events returned by the invoked on any event session. <finalize> contains executable content that is executed whenever the external service returns an event after the <invoke> has been executed. This executable content will be is applied before the system looks for transitions that match the event. In the case of parallel states, only the finalize code in the original invoking state will be executed. Within the executable content, the special system variable '_event' may can be used to refer to the data contained in the event which is being finalized. processed.In the case of parallel states, only the finalize code in the original invoking state is executed.

In a conformant SCXML document, the executable content inside <finalize> MUST NOT raise events or invoke external actions. In particular, the <send> and <raise> elements MUST NOT occur.

If no executable content is specified, a default canonicalization handler will be invoked which will the SCXML Processor MUST update the data model with any return values corresponding to that have a name that matches the 'location' attribute of a <param> elements with missing "expr" attributes. element inside the <invoke>. Thus the effect of a an <invoke> with <param> element with an empty "expr" a 'location' attribute coupled with an empty <finalize> element is first to send all or the part of the data model specified by 'location' to the invoked component and then to update that part of the state machine's data model with the returned values. Note that the automatic update does not take place if the <finalize> element is absent as opposed to empty.

The purpose of the <finalize> code is to enable transformations between the data contained in events returned by the external service and the state machine's data model where the event data may be then stored. It MUST not raise events or invoke external actions. In particular, the <send> and <raise> elements may not occur.

In the example below, a state machine using an ECMAScript data model invokes a clock object that returns the current time in a ping event with an XML payload that includes the currentSecond, currentMinute, currentHour (1-12), and an isAm flag. <finalize> maps this data into an ECMAScript date object that is used in the condition of a transition. Thus <finalize> normalizes the data before the conditions on transitions are evaluated.

<scxml version="1.0" datamodel="ecmascript">
....
 <state id="getTime">
   <transition event="ping" cond="time.getHours() > 17 ||  time.getHours() < 9" target="storeClosed"/>
   <transition event="ping" target="takeOrder"/>
   <datamodel>
     <data id="time" expr="new Date()"/>
   </datamodel>
   <invoke id="timer" type="x-clock" src="clock.pl">
     <finalize>
       <script>
         time.setSeconds(_event.data.currentSecond);
         time.setMinutes(_event.data.currentMinute);
         time.setHours(_event.data.currentHour + (_event.isAm ? 0 : 12) - 1);
       </script>
     </finalize>
   </invoke>
 </state>
....

A Open Issues A.1 Schema is Missing No schema is provided in this draft. An updated schema will be provided in the next draft. A.2 Algorithm Doesn't Handle Internal Transitions The current version of the algorithm treats all transitions as if 'type'="external", so transitions with 'type'="internal" are not handled correctly. This will be fixed in the next draft. A.3 Iterative Construct We are considering adding an iterative construct, such as 'foreach' or 'while', to the executable content in the Core module. Such a construct is not strictly necessary, since iterators can be modeled by conditionalized targetless transitions. For example, to model a 'while' loop with condition C and body B, create an eventless transition with condition C and executable content B. It will keep firing and executing B without leaving its containing state as long as C is true. However, an explicit iterator might permit more succinct state machines. We solicit comments on the usefulness of such a construct. A.4 Simplification of <send> and <raise> Originally, when send and raise were proposed, send was for external communication between the SCXML state machine and an external instance (which might be an SCXML state machine or might be something else). Raise was an internal mechanism that allowed a state machine to raise an internal event - even in the absence of an external communication module or in the absence of a data model. The semantics of sending oneself an event and raising an event were further different because when an event is sent using the send tag it always went on the external event queue, and when one raised an event that was always delivered to the internal event queue. Over time, there were change requests to allow data passing with the raise tag. This is never really strictly necessary since the data model is global and the raised event is internal to the state machine, but it can be convenient if the same transition may not care if it is handling a raised event or an external event or if the data model may be modified in between when an event is raised and when it ends up being handled (due to the presence of other events on the internal event queue). Over time, there were also change requests to allow the send tag, from the external communications module, to be able to send an event to the internal queue. The special _internal valuer was used in send to achieve this goal. This is never strictly necessary due to the presence of the raise tag, but might be convenient if the send tag used targetexpr where the target is sometimes _internal and sometimes an external resource. With these change requests the raise and send tags have become more similar and there are some discussions about what should be done. There are some arguments for leaving things as is: namely the raise is lighter weight than the send and could be present even in the absence of the external communications module. However there are arguments for changing the current state of the world as well: namely there are two ways to do the same thing and some people would rather either combine the two tags to make it less confusing or else make the separation more distinct by reverting the functionality in either send or raise or both to keep the two purposes distinct. The working group is considering these issues and solicits comments from the wider community on which approach they prefer. A.5 autoforward behavior When an external process is invoked with @autoforward="true", all events the parent process receives are automatically forwarded to the invoked process. Should this forwarding behavior include events that were sent by the invoked process? For example, if session scxml1 invokes an external process proc2 with @autoforward="true", and proc2 sends an event e1 back to scxml1, should scxml1 send e1 back to proc2, or should autoforwarding apply only to events that did not originate from proc2? B A Algorithm for SCXML Interpretation

This section presents a normative algorithm for the interpretation of an SCXML document. Implementations are free to implement SCXML interpreters in any way they choose, but they must behave as if they were using the algorithm defined here.

The fact that SCXML implements a variant of the Statechart formalism does not as such determine a semantics for SCXML. Many different Statechart variants have been proposed, each with its own semantics. This section presents an informal semantics of SCXML documents, as well as a normative algorithm for the interpretation of SCXML documents.

Informal Semantics

The following definitions and highlevel principles and constraint are intended to provide a background to the normative algorithm, and to serve as a guide for the proper understanding of it.

Preliminary definitions

state
An element of type <state>, <parallel>, <final> or <scxml>.
pseudo state
An element of type <initial> or <history>.
transition target
A state, or an element of type <history>.
atomic state
A state of type <state> with no child states, or a state of type <final>.
compound state
A state of type <state> with at least one child state.
start state A dummy state equipped with a transition which when triggered by the Run event leads to the initial state(s). Added by the interpreter with an id guaranteed to be unique within the statemachine. The only role of the start state is to simplify the algorithm. configuration
The maximal consistent set of states (including parallel and final states) that the machine is currently in. We note that if a state s is in the configuration c, it is always the case that the parent of s (if any) is also in c. Note, however, that <scxml> is not a(n explicit) member of the configuration.
source state
The source state of a transition is the atomic state from which the transition departs.
target state
A target state of a transition is a state that the transition is entering. Note that a transition can have zero or more target states.
targetless transition
A transition having zero target states.
eventless transition
A transition lacking the 'event' attribute.
external event
An SCXML event appearing in the external event queue. Such events are either sent by external sources or generated with the <send> element.
internal event
An event appearing in the internal event queue. Such events are either raised automatically by the platform or generated with the <event> element.
microstep
A microstep involves the processing of a single transition (or, in the case of parallel states, a single set of transitions.) A microstep may change the the current configuration, update the datamodel and/or generate new (internal and/or external) events. This, by causality, may in turn enable additional transitions which will be handled in the next microstep in the sequence, and so on.
macrostep
A macrostep consists of a sequence (a chain) of microsteps, at the end of which the state machine is in a stable state and ready to process an external event. Each external event causes an SCXML state machine to take exactly one macrostep. However, if the external event does not enable any transitions, no microstep will be taken, and the corresponding macrostep will be empty.

Principles and Constraints

We state here some principles and constraints, on the level of semantics, that SCXML adheres to:

Encapsulation
An SCXML processor is a pure event processor . The only way to get data into an SCXML statemachine is to send external events to it. The only way to get data out is to receive events from it.
Causality
There shall be a causal justification of why events are (or are not) returned back to the environment, which can be traced back to the events provided by the system environment.
Determinism
An SCXML statemachine which does not invoke any external event processor must always react with the same behavior (i.e. the same sequence of output events) to a given sequence of input events (unless, of course, the statemachine is explicitly programmed to exhibit an non-deterministic behavior). In particular, the availability of the <parallel> element must not introduce any non-determinism of the kind often associated with concurrency. Note that observable determinism does not necessarily hold for state machines that invoke other event processors.
Completeness
An SCXML interpreter must always treat an SCXML document as completely specifying the behavior of a statemachine. In particular, SCXML is designed to use priorities (based on document order) to resolve situations which other statemachine frameworks would allow to remain under-specified (and thus non-deterministic, although in a different sense from the above).
Run to completion
SCXML adheres to a run to completion semantics in the sense that an external event can only be processed when the processing of the previous external event has completed, i.e. when all microsteps (involving all triggered transitions) have been completely taken.
Termination
A microstep always terminates. A macrostep may not. A macrostep that does not terminate may be said to consist of an infinitely long sequence of microsteps. This is currently allowed.

Algorithm

This section presents a normative algorithm for the interpretation of SCXML documents. Implementations are free to implement SCXML interpreters in any way they choose, but they must behave as if they were using the algorithm defined here. Note that the algorithm assumes a Lisp-like semantics in which the empty Set null is equivalent to boolean 'false' and all other entities are equivalent to 'true'.

Datatypes

These are the abstract datatypes that are used in the algorithm.

datatype List
   function head()      // Returns the head of the list
   function tail()      // Returns the tail of the list
   function append(l)   // Returns the list appended with l
   function filter(f)   // Returns the list of elements that satisfy the predicate f
   function some(f)     // Returns true if some element in the list satisfies the predicate f
   function every(f)    // Returns true if every element in the list satisfies the predicate f
datatype OrderedSet
    add(e)     // Adds e to the set

   procedure add(e)     // Adds e to the set if it is not already a member
   procedure delete(e)  // Deletes e from the set
   function member(e)   // Is e a member of set?
   function isEmpty()   // Is the set empty?
    toList()    // Converts the set to a list that reflects the order in which elements were added.
    diff(set2)  // Returns an OrderedSet containing all members of OrderedSet that are not in set2. 

   function toList()    // Converts the set to a list that reflects the order in which elements were originally added.
   procedure clear()    // Remove all elements from the set (make it empty)   
   function diff(set2)  // Returns an OrderedSet containing all members of OrderedSet that are not in set2, preserving the original set order. 
datatype Queue
   procedure enqueue(e) // Puts e last in the queue
   function dequeue()   // Removes and returns first element in queue
   function isEmpty()   // Is the queue empty?
datatype BlockingQueue
   procedure enqueue(e) // Puts e last in the queue
   function dequeue()   // Removes and returns first element in queue, blocks if queue is empty

Global variables

The following variables are global from the point of view of the algorithm. Their values will be set in the procedureinterpret().

datamodel;
 configuration;
 previousConfiguration
 statesToInvoke
 datamodel
 internalQueue;
 externalQueue;
 historyValue;
 continue

global configuration
global previousConfiguration
global statesToInvoke
global datamodel
global internalQueue
global externalQueue
global historyValue
global continue
global binding

Predicates

The following binary predicates are used for determining the order in which states are entered and exited.

entryOrder // Ancestors precede descendants, with document order being used to break ties
exitOrder  // Descendants precede ancestors, with reverse document order being used to break ties

Procedures and Functions

This section defines the procedures and functions that make up the core of the SCXML interpreter.

procedure interpret(scxml,id)

The purpose of this procedure is to initialize the interpreter and to start processing. It is called with a parsed representation of an SCXML document.

In order to interpret an SCXML document, first convert initial attributes to <initial> container children with transitions to the state specified by the attribute (such transitions will not contain any executable content). Then (optionally) validate the resulting SCXML, and throw an exception if validation fails. Create an empty configuration complete with a new populated instance of the data model and a execute the global scripts. Create the two queues to handle events and set the global continue variable to true. Finally call enterState on the initial transition that is a child of scxml and start the interpreter's event loop.

interpret(doc):

procedure interpret(doc):

    expandScxmlSource(doc)
    if not valid(doc): failWithError()
    configuration = new OrderedSet()
    previousConfiguration = new OrderedSet()
    statesToInvoke = new OrderedSet()
    datamodel = new Datamodel(doc)
    executeGlobalScriptElements(doc)
    internalQueue = new Queue()
    externalQueue = new BlockingQueue()
    continue = true
    binding = doc.binding
    if binding == "early":
        initializeDatamodel(datamodel, doc)

    enterState([doc.initial.transition])
    startEventLoop()

procedure startEventLoop()

Upon entering the state machine, we take all internally enabled transitions, namely those that either don't require an event or that are triggered by internal events. (Internal events can only be generated by the state machine itself.) When all such transitions have been taken, we move to the main event loop, which is driven by external events.

procedure startEventLoop():
    initialStepComplete = false ;

procedure startEventLoop():
    initialStepComplete = false

    until initialStepComplete:
        enabledTransitions = selectEventlessTransitions()
        if enabledTransitions.isEmpty():
            if internalQueue.isEmpty(): 
                initialStepComplete = true 
            else:
                internalEvent = internalQueue.dequeue()
                datamodel["event"] = internalEvent
                enabledTransitions = selectTransitions(internalEvent)
        if not enabledTransitions.isEmpty():
             microstep(enabledTransitions.toList())

            microstep(enabledTransitions.toList())

    mainEventLoop()

procedure mainEventLoop()

This loop runs until we enter a top-level final state or an external entity cancels processing. In either case 'continue' will be set to false (see EnterStates, below, for termination by entering a top-level final state.)

Each iteration through the loop consists of three main steps: 1) execute any <invoke> tags for states that we entered on the last iteration through the loop 2) Wait for an external event and then execute any transitions that it triggers. However special preliminary processing is applied to the event if the state has executed any <invoke> elements. First, if this event was generated by an invoked process, apply <finalize> processing to it. Secondly, if any <invoke> elements have autoforwarding set, forward the event to them. These steps apply before the transitions are taken. 3) Take any subsequent internally enabled transitions, namely those that don't require an event or that are triggered by an internal event.

This event loop thus enforces run-to-completion semantics, in which the system process an external event and then takes all the 'follow-up' transitions that the processing has enabled before looking for another external event. For example, suppose that the external event queue contains events ext1 and ext2 and the machine is in state s1. If processing ext1 takes the machine to s2 and generates internal event int1, and s2 contains a transition t triggered by int1, the system is guaranteed to take t, no matter what transitions s2 or other states have that would be triggered by ext2. Note that this is true even though ext2 was already in the external event queue when int1 was generated. In effect, the algorithm treats the processing of int1 as finishing up the processing of ext1.

procedure mainEventLoop():

procedure mainEventLoop():

    while continue:
        for state in statesToInvoke:
            for inv in state.invoke:
                invoke(inv)
        statesToInvoke.clear()
        previousConfiguration = configuration
        externalEvent = externalQueue.dequeue() # this call blocks until an event is available        
        datamodel["event"] = externalEvent
        for state in configuration:
            for inv in state.invoke:
                if inv.invokeid == externalEvent.invokeid:  # event is the result of an <invoke> in this state
                    applyFinalize(inv, externalEvent)
                if inv.autoforward:
                    send(inv.id, externalEvent)    
        enabledTransitions = selectTransitions(externalEvent)
        if not enabledTransitions.isEmpty():
            microstep(enabledTransitions.toList())
            # now take any newly enabled null transitions and any transitions triggered by internal events
            macroStepComplete = false 
            until macroStepComplete:
                enabledTransitions = selectEventlessTransitions()
                if enabledTransitions.isEmpty():
                    if internalQueue.isEmpty(): 
                        macroStepComplete = true 
                    else:
                        internalEvent = internalQueue.dequeue()
                        datamodel["event"] = internalEvent
                        enabledTransitions = selectTransitions(internalEvent)
                if not enabledTransitions.isEmpty():
                    microstep(enabledTransitions.toList())   
    # if we get here, we have reached a top-level final state or some external entity has set continue to false         
    exitInterpreter()      

procedure exitInterpreter()

The purpose of this procedure is to exit the current SCXML process by exiting all active states. If the machine is in a top-level final state, a Done event is generated. (Note that in this case, the final state will be the only active state.) The implementation of returnDoneEvent is platform-dependent, but if this session is the result of an <invoke> in another SCXML session, returnDoneEvent will cause the event done.invoke.<id> to be placed in the external event queue of that session, where <id> is the id generated in that session when the <invoke> was executed.

exitInterpreter():

procedure exitInterpreter():

    statesToExit = configuration.toList().sort(exitOrder)
    for s in statesToExit:
        for content in s.onexit:
            executeContent(content)
        for inv in s.invoke:
            cancelInvoke(inv)
        configuration.delete(s)
        if isFinalState(s) and isScxmlState(s.parent):   
            returnDoneEvent(s.donedata)

function selectEventlessTransitions()

This function selects all transitions that are enabled in the current configuration that do not require an event trigger. First test if the state has been preempted by a transition that has already been selected and that will cause the state to be exited when it is taken. If the state has not been preempted, find a transition with no 'event' attribute whose condition evaluates to true . If multiple matching transitions are present, take the first in document order. If none are present, search in the state's ancestors in ancestry order until one is found. As soon as such a transition is found, add it to enabledTransitions, and proceed to the next atomic state in the configuration. If no such transition is found in the state or its ancestors, proceed to the next state in the configuration. When all atomic states have been visited and transitions selected, return the set of enabled transitions.

selectEventlessTransitions():

function selectEventlessTransitions():

    enabledTransitions = new OrderedSet()
    atomicStates = configuration.toList().filter(isAtomicState).sort(documentOrder)
    for state in atomicStates:
        if not isPreempted(state, enabledTransitions):
            loop: for s in [state].append(getProperAncestors(state, null)):
                for t in s.transition:
                    if not t.event and conditionMatch(t): 
                        enabledTransitions.add(t)
                        break loop
    return enabledTransitions

function selectTransitions(event)

The purpose of the selectTransitions()procedure is to collect the transitions that are enabled by this event in the current configuration.

Create an empty set of enabledTransitions . For each atomic state test if the state has been preempted by a transition that has already been selected and that will cause the state to be exited when it is taken. If the state has not been preempted, find a transition whose 'event' attribute matches event and whose condition evaluates to true . If multiple matching transitions are present, take the first in document order. If none are present, search in the state's ancestors in ancestry order until one is found. As soon as such a transition is found, add it to enabledTransitions, and proceed to the next atomic state in the configuration. If no such transition is found in the state or its ancestors, proceed to the next state in the configuration. When all atomic states have been visited and transitions selected, return the set of enabled transitions.

selectTransitions(event):

function selectTransitions(event):

    enabledTransitions = new OrderedSet()
    atomicStates = configuration.toList().filter(isAtomicState).sort(documentOrder)
    for state in atomicStates:
        if not isPreempted(state, enabledTransitions):
            loop: for s in [state].append(getProperAncestors(state, null)):
                for t in s.transition:
                    if t.event and nameMatch(t.event, event.name) and conditionMatch(t):
                        enabledTransitions.add(t)
                        break loop
    return enabledTransitions

function isPreempted(s transitionList)

Return true if a transition T in transitionList exits an ancestor of state s. In this case, taking T will pull the state machine out of s and thus we say that it preempts the selection of a transition from s. Such preemption will occur only if s is a descendant of a parallel region and T exits that region. If we did not do this preemption check, we could end up in an illegal configuration, namely one in which there were multiple active states that were not all descendants of a common parallel ancestor.

isPreempted(s transitionList):

function isPreempted(s, transitionList):

    preempted = false 
    for t in transitionList:
        if t.target:
            LCA = findLCA([t.source].append(getTargetStates(t.target)))
            if isDescendant(s,LCA):
                preempted = true 
                break
    return preempted

procedure microstep(enabledTransitions)

The purpose of the microstep procedure is to process a single set of transitions. These may have been enabled by an external event, an internal event, or by the presence or absence of certain values in the datamodel at the current point in time. The processing of the enabled transitions must be done in parallel ('lock step') in the sense that their source states must first be exited, then their actions must be executed, and finally their target states entered.

If a single atomic state is active, then enabledTransitions will contain only a single transition. If multiple states are active (i.e., we are in a parallel region), then there may be multiple transitions, one per active atomic state (though some states may not select a transition.) In this case, the transitions are taken in the document order of the atomic states that selected them.

microstep(enabledTransitions):

procedure microstep(enabledTransitions):

    exitStates(enabledTransitions)
    executeTransitionContent(enabledTransitions)
    enterStates(enabledTransitions)

procedure exitStates(enabledTransitions)

Create an empty statesToExit set. For each transition t in enabledTransitions, if t is targetless then do nothing, else let LCA be the least common ancestor state of the source state and target states of t. Add to the statesToExit set all states in the configuration that are descendants of LCA. Next remove all the states on statesToExit from the set of states that will have invoke processing done at the start of the next macrostep. (Suppose macrostep M1 consists of microsteps m11 and m12. We may enter state s in m11 and exit it in m12. We will add s to statesToInvoke in m11, and must remove it in m12. In the subsequent macrostep M2, we will apply invoke processing to all states that were enter, and not exited, in M1.) Then convert statesToExit to a list and sort it in exitOrder.

For each state s in the list, if s has a deep history state h, set the history value of h to be the list of all atomic descendants of s that are members in the current configuration, else set its value to be the list of all immediate children of s that are members of the current configuration. Again for each state s in the list, first execute any onexit handlers, then cancel any ongoing invocations, and finally remove s from the current configuration.

[NOTE: this function must be updated to handle transitions with 'type'="internal". It currently treats all transitions as if they were external.]
exitStates(enabledTransitions):
    statesToExit = new OrderedSet()
    for t in enabledTransitions:
        if t.target:
            LCA = findLCA([t.source].append(getTargetStates(t.target)))
            for s in configuration:
                if isDescendant(s,LCA):
                    statesToExit.add(s)

procedure exitStates(enabledTransitions):
   statesToExit = new OrderedSet()
   for t in enabledTransitions:
       if t.target:
           if t.type == "internal" and getTargetStates(t.target).every(lambda s: isDescendant(s,t.source)):
               ancestor = t.source
           else:
               ancestor = findLCA([t.source].append(getTargetStates(t.target)))
           for s in configuration:
               if isDescendant(s,ancestor):
                   statesToExit.add(s)                    

    for s in statesToExit:
        statesToInvoke.delete(s)
    statesToExit = statesToExit.toList().sort(exitOrder)
    for s in statesToExit:
        for h in s.history:
            if h.type == "deep":
                f = lambda s0: isAtomicState(s0) and isDescendant(s0,s) 
            else:
                f = lambda s0: s0.parent == s
            historyValue[h.id] = configuration.toList().filter(f)
    for s in statesToExit:
        for content in s.onexit:
            executeContent(content)
        for inv in s.invoke:
            cancelInvoke(inv)
        configuration.delete(s)

procedure executeTransitionContent(enabledTransitions)

For each transition in the list of enabledTransitions , execute its executable content.

executeTransitionContent(enabledTransitions):

procedure executeTransitionContent(enabledTransitions):

    for t in enabledTransitions:
        executeContent(t)

procedure enterStates(enabledTransitions)

Create an empty statesToEnter set, and an empty statesForDefaultEntry set. For each transition t in enabledTransitions, if t is targetless then do nothing, else let LCA be the least common ancestor state of the source state and target states of t. For for each target state s, call statesToEnte. addStatesToEnter. This will add to statesToEnter s plus all any descendent states that will have to be entered in order to enter s. (This may include by default once s is entered. (If s is atomic, there will not be any such states.) Now for each target state s, add any of s's ancestors or parallel siblings.) If LCA that must be entered when s is entered. (These will be any ancestors of s that are not currently active. Note that statesToEnter is a parallel state, set, so it is harmless if the same ancestor is entered multiple times.) In the case where the ancestor state is parallel, call statesToEnter addStatesToEnter on each any of its children.) child states that do not already have a descendent on statesToEnter. (If a child state already has a descendant on statesToEnter, it will get added to the list when we examine the ancestors of that descendant.)

We now have a complete list of all the states that will be entered as a result of taking the transitions in enabledTransitions. Add them to statesToInvoke so that invoke processing can be done at the start of the next macrostep. Convert statesToEnter to a list and sort it in enterorder. entryorder. For each state s in the list, first add s to the current configuration, then configuration. Then if we are using late binding, and this is the first time we have entered s, initialize its data model. Then execute any onentry handlers. If s's initial state is being entered by default, execute any executable content in the initial transition. Finally, if s is a final state, generate relevant Done events. If we have reached a top-level final state, set continue to false as a signal to stop processing.

enterStates(enabledTransitions):

procedure enterStates(enabledTransitions):

    statesToEnter = new OrderedSet()
    statesForDefaultEntry = new OrderedSet()
    for t in enabledTransitions:
        if t.target:
            LCA = findLCA([t.source].append(getTargetStates(t.target)))
            for s in getTargetStates(t.target):
                addStatesToEnter(s,LCA,statesToEnter,statesForDefaultEntry)
            if isParallelState(LCA):
                for child in getChildStates(LCA):
                    addStatesToEnter(child,LCA,statesToEnter,statesForDefaultEntry)

            tstates = getTargetStates(t.target)
            if t.type == "internal" and tstates.every(lambda s: isDescendant(s,t.source)):
                ancestor = t.source
            else:
                ancestor = findLCA([t.source].append(tstates))
            for s in tstates:
                addStatesToEnter(s,statesToEnter,statesForDefaultEntry)
            for s in tstates:
                for anc in getProperAncestors(s,ancestor):
                    statesToEnter.add(anc)
                    if isParallelState(anc):
                        for child in getChildStates(anc):
                            if not statesToEnter.some(lambda s: isDescendant(s,child)):
                                addStatesToEnter(child,statesToEnter,statesForDefaultEntry)  

    for s in statesToEnter:
        statesToInvoke.add(s)
    statesToEnter = statesToEnter.toList().sort(enterOrder)
    for s in statesToEnter:
        configuration.add(s)
        if binding == "late" and s.isFirstEntry:
            initializeDataModel(datamodel.s,doc.s)
            s.isFirstEntry = false

        for content in s.onentry:
            executeContent(content)
        if statesForDefaultEntry.member(s):
            executeContent(s.initial.transition)
        if isFinalState(s):
            parent = s.parent
            grandparent = parent.parent
            internalQueue.enqueue(new Event("done.state." + parent.id, parent.donedata))
            if isParallelState(grandparent):
                if getChildStates(grandparent).every(isInFinalState):
                    internalQueue.enqueue(new Event("done.state." + grandparent.id, grandparent.donedata))
    for s in configuration:
        if isFinalState(s) and isScxmlState(s.parent):
            continue = false

procedure addStatesToEnter(s,root,statesToEnter,statesForDefaultEntry) addStatesToEnter(state,root,statesToEnter,statesForDefaultEntry)

The purpose of this procedure is to add to statesToEnter all states state and/or any of its descendants that must be entered as a result of entering state s. being the target of a transition. Note that this procedure permanently modifies both statesToEnter and statesForDefaultEntry.

First, If s state is a history state then add either the history values associated with sor s's state or state's default target to statesToEnter. Else (if s state is not a history state), add >s state to statesToEnter. Then, if s state is a parallel state, add each of s's children to statesToEnter. Else, if s is a compound state, add s state to statesForDefaultEntry and add recursively call addStatesToenter on its default initial state to statesToEnter. Finally, for each ancestor anc of s, add anc to statesToEnter and state(s). Otherwise, if anc state is a parallel state, add any child of anc that does not have a descendant recursively call addStatesToEnter on statesToEnter to statesToEnter. each of its child states.

addStatesToEnter(s,root,statesToEnter,statesForDefaultEntry):
    if isHistoryState(s):
         if historyValue[s.id]:
             for s0 in historyValue[s.id]:
                  addStatesToEnter(s0,s,statesToEnter,statesForDefaultEntry)
         else:
             for t in s.transition:
                 for s0 in getTargetStates(t.target):
                     addStatesToEnter(s0,s,statesToEnter,statesForDefaultEntry)

procedure addStatesToEnter(state,statesToEnter,statesForDefaultEntry):
    if isHistoryState(state):
        if historyValue[state.id]:
            for s in historyValue[state.id]:
                addStatesToEnter(s,statesToEnter,statesForDefaultEntry)
        else:
            for t in state.transition:
                for s in getTargetStates(t.target):
                    addStatesToEnter(s,statesToEnter,statesForDefaultEntry)

    else:
        statesToEnter.add(s)
        if isParallelState(s):
            for child in getChildStates(s):
                addStatesToEnter(child,s,statesToEnter,statesForDefaultEntry)
        elif isCompoundState(s):
            statesForDefaultEntry.add(s)
            for tState in getTargetStates(s.initial):
                addStatesToEnter(tState, s, statesToEnter, statesForDefaultEntry)
        for anc in getProperAncestors(s,root):
            statesToEnter.add(anc)
            if isParallelState(anc):
                for pChild in getChildStates(anc):
                    if not statesToEnter.toList().some(lambda s2: isDescendant(s2,pChild)):
                          addStatesToEnter(pChild,anc,statesToEnter,statesForDefaultEntry)

        statesToEnter.add(state)
        if isCompoundState(state):
            statesForDefaultEntry.add(state)
            for s in getTargetStates(state.initial):
                addStatesToEnter(s,statesToEnter,statesForDefaultEntry)
        elif isParallelState(state):
            for s in getChildStates(state):
                addStatesToEnter(s,statesToEnter,statesForDefaultEntry)

procedure isInFinalState(s)

Return true if s is a compound <state> and one of its children is an active <final> state (i.e. is a member of the current configuration), or if s is a <parallel> state and isInFinalState is true of all its children.

isInFinalState(s):

function isInFinalState(s):

    if isCompoundState(s):
        return getChildStates(s).some(lambda s: isFinalState(s) and configuration.member(s))
    elif isParallelState(s):
        return getChildStates(s).every(isInFinalState)
    else:
        return false

function findLCA(stateList)

The Least Common Ancestor is the element s such that s is a proper ancestor of all states on stateList and no descendant of s has this property. Note that there is guaranteed to be such an element since the <scxml> wrapper element is a common ancestor of all states. Note also that since we are speaking of proper ancestor (parent or parent of a parent, etc.) the LCA is never a member of stateList.

(stateList):

function findLCA(stateList):

    for anc in getProperAncestors(stateList.head(), null):
        if stateList.tail().every(lambda s: isDescendant(s,anc)):
            return anc

C Schemas B Schema

[NOTE: No The schemas for SCXML can be found in www.w3.org/2011/04/SCXML . The master schema is provided with this draft. An updated http://www.w3.org/2011/04/SCXML/scxml.xsd . The schema will be provided in the next draft.] for SCXML messages is http://www.w3.org/2011/04/SCXML/scxml-message.xsd

C Conformance

This section is normative.

D Conformance

D.1 C.1 Conforming Documents

The following conformance requirements hold for all SCXML documents.

  1. The root element of the document MUST be <scxml>.
  2. The <scxml> element MUST include a "version" attribute with the value "1.0".
  3. The <scxml> element MUST designate the SCXML namespace. This can be achieved by declaring an "xmlns" attribute or an attribute with an "xmlns" prefix [XMLNames] . The namespace for SCXML is defined to be http://www.w3.org/2005/07/scxml.
  4. The document MUST conform to all the syntactic constraints defined in this specification, including those contained in the schema, those contained in the "Attribute Constraints" and "Valid Values" fields in the attribute tables, and those contained in the definition of its children.
  5. The document MUST conform to any additional syntactic constraints that are defined for the data model that it has chosen. ee See E D Data Models for the definition of the individual data models.

D.2 C.2 Conforming Processors

A SCXML 1.0 processor is a user agent that can parse and process Conforming SCXML 1.0 documents.

In a Conforming SCXML 1.0 Processor, the XML parser MUST be able to parse and process all well-formed XML constructs defined within [XML] and [XMLNames] . It is not required that a Conforming SCXML 1.0 processor use a validating parser.

A Conforming SCXML 1.0 Processor MUST support the syntax and semantics of all mandatory SCXML elements described in this document. A Conforming SCXML 1.0 Processor MAY support the syntax and semantics of any optional SCXML elements described in this document. A Conforming SCXML 1.0 Processor MUST behave as if it were executing the algorithm specified in A Algorithm for SCXML Interpretation .

When a Conforming SCXML 1.0 Processor encounters a Conforming SCXML 1.0 Document with non-SCXML elements or attributes which are proprietary, or defined in a non-SCXML namespace, it MAY MUST behave as instructed by the 'exmode' attribute.

process

When a Conforming SCXML 1.0 Processor encounters a nonconformant document, then if 'exmode' is "strict", it MUST reject the non-standard elements and/or attributes ignore document and SHOULD signal an error to the non-standard elements and/or attributes entity that requested the execution of the document. The means of signaling this error are platform-specific and outside the scope of this specification. Note specifically that in this case, a Conforming SCXML Processor MUST NOT enter the initial state of a nonconformant SCXML document. When a Conforming SCXML 1.0 Processor encounters a nonconformant document, and 'exmode' is not "strict", its behavior is undefined.

There is, however, is no conformance requirement with respect to performance characteristics of the SCXML 1.0 Processor.

E D Data Models

The 'datamodel' attribute on <scxml> defines the data model that the document uses. The data model includes the underlying data structure plus languages for boolean expressions, location expressions, value expressions, and scripting. Each conformant SCXML document MUST specify the data model it uses. (Note that the "null" data model is the default.) Conformant SCXML processors MUST support the null data model, and MAY support other data models, including the ECMAScript and XPath data models. The ECMAScript and XPath model definitions given here are normative in the sense that they define how implementations that support one of these languages MUST behave. The intent is to insure interoperability among all processors that support ECMAScript, and all those that support XPath, without requiring all implementations to support either of those data model languages.

The definition of a data model MUST :

  • Specify the boolean expression language used as the value of the'cond' attribute in <transition>, <if> and <elseif> This language MUST not have side effects and MUST include the predicate 'In', which takes a single argument, the id of a state in the enclosing state machine, and returns 'true' if the state machine is in that state.
  • Specify the location expression language that is used as the value of the 'location' attribute of the <assign> tag.
  • Specify the value expression language that is used as the value of the 'expr' attribute of the <data> and <assign> elements.
  • Specify the scripting language used inside the <script> element

E.2 D.2 The ECMAScript Data Model

The value 'ecmascript' for the 'datamodel' attribute results in an ECMAScript ECMASccript data model. Implementations that support this value MUST support the third edition of ECMAScript [ECMASCRIPT-262] . Implementations MAY support ECMAScript for XML (E4X) [E4X] .

E.2.5 D.2.6 System Variables

The SCXML Processor MUST define an ECMAScript read-only variable for each system variable defined in 5.11 System Variables .The _sessionid and _name system variables are defined as variables with ECMAScript read-only variables. String values. The _event system variable is defined as an object with two properties: name (String value) properties for the name each of the event; and data (Object value) exposing the event data payload. fields defined in 5.11.1 The Internal Structure of Events : _sessionid name ,type ,sendid ,origin ,origintype , and _name invokeid system variables are defined as variables with ECMAScript String values. The _sessionid and values, while _name data values MUST be set by the processor at session start. is an Object value.

Suppose as part of executing a state machine named "myName" with a platform-assigned sessionid "12345", we are processing an event with the name "foo.bar" and the following object payload:

    { "answer" : 42 }

Then the underlying ECMA datamodel would have the following form:

As an example, here is a sample transition that accesses the _event variable in that data model.

D.2.9 Unsupported Elements

5.5 <validate> is not supported in the ECMA Data Model. If the SCXML processor encounters a document specifying the ECMA Data Model and containing this element, it MUST behave as instructed by the 'exmode' attribute on <scxml>. See 3.2 <scxml> for details.

E.3 D.3 The XPath Data Model

The value "xpath" for the 'datamodel' attribute results in an XML data model with XPath used as the expression language. Implementations that support this data model MUST support [XPath 2.0] .

E.3.4 System Variables Within the Data Model, three implicit <data> elements are defined to hold the system variables as described in section 5.6 of the [XPath 2.0] specification. These are named $_event , $_sessionid , and $_name . The $_event value MUST be assigned by processor before triggering executable content in the <onentry>, <onexit>, and <transition> elements which may reference the variable. The processor MUST clear the value by setting its child elements <name> and <data> to empty XML elements when event processing has completed. The $_sessionid and $_name values MUST be set by the processor at session start. Suppose as part of executing a state machine named "myName" with a platform-assigned sessionid "12345", we are processing an event with the name "foo.bar" and the following XML payload: <payload xmlns=""> <answer>42</answer> </payload> Then the underlying XML datamodel would have the following form: Example: Illustration of system injected data <datamodel> <!-- The three data elements below are automatically populated by the system --> <data id="_name">myName</data> <data id="_sessionid">12345</data> <data id="_event"> <name xmlns="">foo.bar</name> <data xmlns=""> <payload> <answer>42</answer> </payload> </data> </data> <!-- Rest of the application / developer-authored data model goes here --> </datamodel> As an example, here is a sample transition that accesses the $_sessionid variable in that data model. <state id="checkSessionid"> <transition cond="$_sessionid = '12345'" target="nextState"/> ... </state> E.3.5 Scripting There is no scripting language. E.3.6 D.3.5 <assign> Element Extension

Implementations supporting the XPath datamdel MAY MUST support an the following additional attribute attributes for the <assign> element, as shown below. element.

Name Required Attribute Constraints Type Default Value Valid Values Description
dataid type false IDREF enum none replacechildren The ID replacechildren, firstchild, lastchild, previoussibling, nextsibling, replace, delete, addattribute Defines the nature of any <data> element in the document insertion to be performed. See below for details.
attr false This attribute must be present if and only if 'type' is 'addattribute'. NMTOKEN none The 'id' of a <data> element. attribute name to add at the specified location.

The SCXML Processor MUST modify the datamodel as directed by the 'type' attribute as described below. If it is provided, unable to do so, it MUST place the error error.execution on the internal event queue:

  • replacechildren. All the children at 'location' expression are replaced with the value specified by 'expr'.
  • firstchild. The value specified by 'expr' is interpreted as applying to inserted before all of the children at 'location'.
  • lastchild. The value specified by 'expr' is inserted after all of this <data> element. If the 'dataid' children at 'location'.
  • previoussibling. The value specified by 'expr' is not specified, inserted before the node specified by 'location', keeping the same parent.
  • nextsibling. The value specified by 'expr' is inserted after the node specified by 'location', keeping the same parent.
  • replace. The node specified by 'location' expression is interpreted as applying to replaced by the children of value specified by 'expr'.
  • delete. The node specified by 'location' is deleted. 'expr' is ignored.
  • addattribute. An attribute with the <datamodel> element. name specified by 'attr' and value specified by 'expr' is added to the node specified by 'location'.

Note that in the case of an XML data model, it is not required to assign to the root of a tree (i.e., the "name" value in a <data> tag), since the path expression can reach down into the tree to assign a new value to an internal node. The following examples show various aspects of assignment in the XPath data model. Suppose we have a data model of the following form:

<data id="cart">
  <myCart xmlns="">
    <books>
      <book>
        <title>The Zen Mind</title>
      </book>
      <book>
        <title>Freakonomics</title>
      </book>
    </books>
    <cds>
      <cd name="Something"/>
    </cds>
  </myCart>
</data>

Here is an example of assignment of a string to an element node.

 
<assign location="$cart/myCart/books/book[1]/title"  expr="'My favorite book'"/>

results in

<data id="cart">
  <myCart xmlns="">
    <books>
      <book>
        <title>My favorite book</title>
      </book>
      <book>
        <title>Freakonomics</title>
      </book>
      ...
</data>

Now suppose we assign an xml structure to an element node. The following assignment statement would have the effect of replacing the children of the element "$cart/myCart/books/book[1]" by the XML tree rooted in <bookinfo>.

<assign location="$cart/myCart/books/book[0]">
  <bookinfo xmlns="">
    <isdn>12334455</isdn>
    <author>some author</author>
  </bookinfo>
</assign>

results in

<data id="cart">
  <myCart xmlns="">
    <books>
      <book>
        <bookinfo>
          <isdn>12334455</isdn>
          <author>some author</author>
        </bookinfo>
      </book>
      <book>
        <title>Freakonomics</title>
      </book>
      ...
</data>

Here are examples of legal and illegal assignment to an attribute:

<!-- Legal assignment: -->
<assign location="$cart/myCart/cds/cd/@name" expr"'Something Else'"/>
<!-- Illegal assignment: -->
<assign  location="$cart/myCart/cds/cd/@name" >
  <foo>
    <bar/>
  </foo>
</assign>

Now suppose we assign a string to a nodeset. The following assignment statement would have the effect of replacing the children of each node in the nodeset $cart/myCart/books/book with the string "The Zen Mind":

<assign location="$cart/myCart/books/book" expr="'The Zen Mind'"/>

results in

<data id="cart">
  <myCart xmlns="">
    <books>
      <book>The Zen Mind</book>
      <book>The Zen Mind</book>
    </books>
    ...
</data>

Finally suppose we assign a structure to a nodeset. The following statement would iterate over the elements in the nodeset of <book> elements and replace their children with the <price> structure:

<assign location="$cart/myCart/books/book">
  <price>20.0</price>
</assign>

results in

<data id="cart">
  <myCart xmlns="">
    <books>
      <book>
        <price>20.0</price>
      </book>
      <book>
        <price>20.0</price>
      </book>
    </books>
    ...
</data>

If the evaluation of any of the expressions in an <assign> element causes an error to be raised, evaluation of the element terminates immediately and the <assign> has no effect. For example, the following assignment statement would raise an error because the sample datamodel we are using does not have an <ISBN> node as a child of <book>:

 
<assign location="$cart/myCart/books/book[1]/ISBN"  expr="'....'"/>

D.3.9 Unsupported Elements

5.9 <script> is not supported in the XPath Data Model. If the SCXML processor encounters a document specifying the XPath Data Model and containing this element, it MUST behave as instructed by the 'exmode' attribute on <scxml>. See 3.2 <scxml> for details.

F E Event I/O Processors

F.1 E.1 SCXML Event I/O Processor

The SCXML Event I/O Processor is intended to transport messages in a specific format to and from SCXML sessions. This processor specifies the schema of the messages message and how they map it maps onto SCXML events, but it does not define the transport mechanism, which is platform-specific. The schema for the message is available at :. The sender or http://www.w3.org/2011/04/SCXML/scxml-message.xsd . SCXML Processors MUST support sending messages to and receiving messages from other SCXML sessions using the receiver of SCXML Event I/O Processor. An SCXML Processor MAY support exchanging messages with non-SCXML endpoints using the message may be either an SCXML session or an external entity, but Event I/O Processor. However this specification defines the behavior for SCXML sessions only . endpoints only.

The contents of the individual messages message are defined as follows:

  1. 'name'. The sending SCXML Processor MUST take the value of the 'name' this attribute is taken from the 'event' attribute of the <send> element. It is then used The receiving SCXML Processor MUST use it as the value the 'name' field in the event that is generated by the receiving processor it generates (see 5.11.1 The Internal Structure of Events ). This field is what is matched against the 'event' attribute of <transition>.
  2. 'source'. The value of the 'source' sending SCXML Processor MUST populate this attribute is with a URI that the receiving processor can use to reply to the sending processor. It is used The receiving SCXML Processor MUST use this URI as the value of the 'origin' field in the event that is generated by the receiving side it generates (see 5.11.1 The Internal Structure of Events ).
  3. 'target'. The 'target' attribute contains an identifier of sending SCXML session to which Processor MUST take the message should be delivered. It is taken value of this attribute from the 'target' attribute of the <send> element. In general, the format of the identifier is platform-specific. However there are two distinguished values. If the value of the 'target' attribute in the <send> element is '_internal', the The receiving session will be identical to the sending session, and it will populate the 'type' field of the resulting event with "internal" and will add the event SCXML Processor MUST use this value to its internal event queue. If the 'target' attribute is not specified, the receiving determine which session will be identical to the sending session, and it will populate the 'type' field of the resulting event with "external" and will add the event to its external event queue. If deliver the value message to. See 6.2.4 The Target of Send for details on the 'target' attribute is anything else, the receiving processor will set the type field interpretation of the resulting event to "external" and will add the event to its external event queue. this identifier.
  4. The 'sendid' 'sendid'. the sending SCXML Processor MUST populate this attribute is populated with the identifier specified in the 'id' attribute or automatically generated by the platform when the <send> tag is executed in the sending SCXML session. (See 6.2 <send> .) It will be used The receiving SCXML Processor MUST use this value as the value of the 'sendid' field in the event that is generated by the receiving processor. it generates. If the author of the sending session did not specify either the 'id' or 'idlocation' attribute, the sending SCXML Processor MUST leave this attribute will be empty.
  5. 'sourcetype'. The 'sourcetype' sending SCXML Processor MUST assign this attribute contains an indication of the type of process value "scxml". (Note that generated the message. It other types of senders will be used to populate assign different values.) The receiving Processor MUST use this value as the value of the 'origintype' field of the event that is generated by the receiving processor. If the sender is an SCXML processor, the value will be "scxml". it generates.
  6. The 'language' attribute is used to indicate the type of data contained in the body of the message inside the <payload> element. The receiving process can use sending SCXML Processor MUST populate this information to parse and validate attribute with the message. value of the 'datamodel' attribute in the <scxml> element.
  7. <payload>. The <payload> sending SCXML Processor MUST populate this element contains with any data that is associated with specified in the message. 'namelist' attribute of in <param> and <content> elements. It will be encoded MUST encode the data in the language indicated by the 'language' attribute, for example XML or JSON. This data may MAY be in any namespace, or in no namespace at all, but it may also contain <scxml:hint> and <scxml:property> elements that provide additional information about all. The receiving SCXML Processor MUST use this value to populate the data. '_data' field of the event that it generates.

The Here is a summary of the mapping between <send>, the SCXML message structure, and the event that is raised in the receiving session is given below. session.

<send> element SCXML Message Structure Target Session Event
'event' attribute 'name' attribute 'name' field
not present in <send> but known to platform 'source' attribute 'origin' field
'target' attribute 'target' attribute not present
literal provided by author or value generated by platform 'sendid' attribute 'sendid' field
not present 'sourcetype' attribute. Always "scxml". 'origintype' field. Always "scxml".
not present 'language' attribute. not present
'namelist' attribute, <content> child, or <param> children <payload> element data field

The sending SCXML Event I/O processor MUST populate these fields of the SCXML message structure in the manner defined above, and the receiving processor MUST use them to create the appropriate internal or external event structure as defined above. When an SCXML processor Processor receives a message via the SCXML Event I/O Processor it validates MUST validate the syntax of the incoming message and checks check that it matches an active session. If the message fails syntactic validation or does not match an active session, the receiving processor notifies Processor MUST notify the sending processor of the error and ignores MUST ignore the message. If the message passes validation, but the receiving processor Processor cannot handle the data format contained in the message, the receiving processor SHOULD Processor MUST raise place the error error.communication in internal queue of the session for which the message was intended and MUST ignore the message. The processor Processor SHOULD also notify the sending processor endpoint of the error. If no errors occur, the receiving session converts Processor CONVERT the message into an SCXML event, using the mapping defined above, and inserts CONVERT insert the event its external event queue.

If the sending entity is an SCXML session, it SHOULD also report errors. For example, if the sending session specifies a sessionid that does not exist on the receiving system, specifies a data format that the receiving session does not support, or is unable to connect to the receiving system, it SHOULD raise place the error error.communication. error.communication on the internal event queue.

The If the current session was triggered by an instance of <invoke>, the SCXML Event I/O Processor MUST handle the 'cancel.invoke. id ' event. In particular, if SCXML session session1 sends this event to session session2, where session1 invoked session2 via an <invoke> element with invokeid id , the SCXML Event I/O Processor MUST set the 'continue' variable as defined in session2 to 'false' and discard the event. (See B Algorithm for SCXML Interpretation 6.4.3 Implementation of <invoke> for details.) . In all other cases (that is, in cases where (namely if the invokeid current session was not triggered by an instance of <invoke> or if the id does not match), match the invokeid of the triggering <invoke> element), the SCXML Event I/O processor MUST discard the event and SHOULD signal an error.

F.1.1 E.1.1 Examples

Here are some examples of SCXML messages sent between SCXML sessions. Each example shows the original <send> element, the corresponding <message> structures and a transition handling the resulting event in the receiving SCXML session.

EXAMPLE 1: First, here is a message with an XML payload generated by <send> with a 'namelist':

SESSION1 : SENDING SESSION
Pattern: "event" attribute with an optional "namelist"
<datamodel>
  <data id="email" expr="'mailto:recipient@example.com'"/>
  <data id="content" expr="'http://www.example.com/mycontent.txt'"/>
  <data id="xmlcontent">
    <headers xmlns="http://www.example.com/headers">
      <cc>archive@example.com</cc>
      <subject>Example email</subject>
    </headers>
  </data>
</datamodel>
  ...
<send id="send-123"
      target="http://scxml-processors.example.com/session2"
      type="scxml" event="email.send"
      namelist="email content xmlcontent"
      hints="Email headers"/>

      namelist="email content xmlcontent"/>

Here is the actual XML message that will be sent over platform-specific transport and converted into an event in the target SCXML session:

<scxml:message xmlns:scxml="http://www.w3.org/2005/07/scxml" version="1.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.w3.org/2005/07/scxml scxml-message.xsd"
       source="http://scxml-processors.example.com/session1" sourcetype="scxml"
       target="http://scxml-processors.example.com/session2" type="scxml"
       sendid="send-123" name="email.send">
  <scxml:payload>
    <scxml:property name="email">mailto:recipient@example.com</scxml:property>
    <scxml:property name="content">http://www.example.com/mycontent.txt</scxml:property>
    <scxml:property name="xmlcontent">
      <scxml:hint>Email headers</scxml:hint>

      <headers xmlns="http://www.example.com/headers">
        <cc>archive@example.com</cc>
        <subject>Example email</subject>
      </headers>
    </scxml:property>
    <scxml:hint>Email headers</scxml:hint>

  </scxml:payload>
</scxml:message>

Here is sample SCXML code to process that event in the receiving SCXML session. In this example <my:email> is platform-specific executable content that sends an email:

SESSION2 : RECEIVING SESSION
Pattern: "event" attribute with an optional "namelist"
<scxml:transition event="email.send">
  <my:email to="data('_event')/scxml:property[@name='email']"
            cc="data('_event')/scxml:property[@name='xmlcontent']/h:headers/h:cc"
            subject="data('_event')/scxml:property[@name='xmlcontent']/h:headers/h:subject"
            content="data('_event')/scxml:property[@name='content']"/>
</scxml:transition>

EXAMPLE 2: The next example shows <send> using inline XML content:

SESSION1 : SENDING SESSION
Pattern: "xmlns" attribute with explicit inline content
<send id="send-123"
      target="http://scxml-processors.example.com/session2"
      type="scxml"
      xmlns:csta="http://www.ecma.ch/standards/ecma-323/csta">
  <content>
     <csta:MakeCall>
       <csta:callingDevice>22343</callingDevice>
       <csta:calledDirectoryNumber>18005551212</csta:calledDirectoryNumber>
     </csta:MakeCall>
  </content>
</send>

Here is the actual XML message that will be sent:

<scxml:message xmlns:scxml="http://www.w3.org/2005/07/scxml" version="1.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.w3.org/2005/07/scxml scxml-message.xsd"
       source="http://scxml-processors.example.com/session1"
       target="http://scxml-processors.example.com/session2"
       sendid="send-123">
  <scxml:payload xmlns:csta="http://www.ecma.ch/standards/ecma-323/csta">
    <csta:MakeCall>
      <csta:callingDevice>22343</csta:callingDevice>
      <csta:calledDirectoryNumber>18005551212</csta:calledDirectoryNumber>
    </csta:MakeCall>
  </scxml:payload>
</scxml:message>

Here is sample SCXML code to process the resulting event in the receiving SCXML session. It uses the special executable content <csta:makecall> to generate a telephone call:

SESSION2 : RECEIVING SESSION
Pattern: "xmlns" attribute with explicit inline content
<scxml:transition event="external.event">
  <csta:makecall callingDevice="data('_event')/csta:MakeCall/csta:callingDevice"
                 callingDirectoryNumber="data('_event')/csta:MakeCall/csta:callingDirectoryNumber"/>
</scxml:transition>

EXAMPLE 3: Finally, here is an example generated by <send> using both 'event' and 'namelist' attributes and using JSON content:

SESSION1 : SENDING SESSION
Pattern: "event" attribute with an optional "namelist"
<datamodel>
  <data id="email" expr="'mailto:recipient@example.com'"/>
  <data id="content" expr="'http://www.example.com/mycontent.txt'"/>
  <data id="jsoncontent" src="http://www.example.com/headers.json"/>
</datamodel>
  ...
<send sendid="send-123"
      target="'http://scxml-processors.example.com/session2'"
      type="'scxml'" event="'email.send'"
      namelist="email content jsoncontent"
      hints="'Email headers'"/>

      namelist="email content jsoncontent"/>

Here is the actual XML message that will be sent over platform-specific transport and converted into an event in the target SCXML session:

<scxml:message xmlns:scxml="http://www.w3.org/2005/07/scxml" version="1.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.w3.org/2005/07/scxml scxml-message.xsd"
       source="http://scxml-processors.example.com/session1"
       target="http://scxml-processors.example.com/session2"
       sendid="send-123" name="email.send" language="json">
  <scxml:payload>
    <scxml:property name="email">mailto:recipient@example.com</scxml:property>
    <scxml:property name="content">http://www.example.com/mycontent.txt</scxml:property>
    <scxml:property name="jsoncontent">
      <scxml:hint>Email headers</scxml:hint>

      <![CDATA[
        headers : {
          cc  : "audit@example.com" ,
          subject : "Example email"
        }
      ]]>
    </scxml:property>
    <scxml:hint>Email headers</scxml:hint>

  </scxml:payload>
</scxml:message>

Here is sample SCXML code to process the resulting event in the receiving SCXML session. In this example, <my:email> is special executable content as in the first example.

SESSION2 : RECEIVING SESSION
Pattern: "event" attribute with an optional "namelist"
<scxml:transition event="email.send">
  <my:email to="_event.email"
            cc="_event.jsoncontent.headers.cc"
            subject="_event.jsoncontent.headers.subject"
            content="_event.content"/>
</scxml:transition>

In some cases it may be convenient to included multiple <message> structures in a single payload. The following schema defines a <messages> element which contains multiple <message> elements. Support for this schema is optional.

scxml-messages.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!--
    XML Schema for sending messages to SCXML processors.
-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.w3.org/2005/07/scxml"
    xmlns="http://www.w3.org/2005/07/scxml"
    elementFormDefault="qualified">
    <xsd:include schemaLocation="scxml-message.xsd"/>
    <xsd:annotation>
        <xsd:documentation xml:lang="en">
            XML Schema for sending messages to SCXML processors.
            Version 1.0
        </xsd:documentation>
        <xsd:documentation source="scxml-copyright.xsd" />
    </xsd:annotation>
    <xsd:attributeGroup name="scxmlmessages.extra.attribs">
        <xsd:annotation>
            <xsd:documentation>
                Group allowing attributes from other namespaces
            </xsd:documentation>
        </xsd:annotation>
        <xsd:anyAttribute namespace="##other" processContents="lax" />
    </xsd:attributeGroup>
    <xsd:attributeGroup name="scxmlmessages.messages.attlist">
        <xsd:attribute name="version" type="xsd:string" fixed="1.0"
            use="required" />
        <xsd:attributeGroup ref="scxmlmessages.extra.attribs" />
    </xsd:attributeGroup>
    <xsd:group name="scxmlmessages.messages.content">
        <xsd:sequence>
            <xsd:element ref="message" minOccurs="1"
                maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:group>
    <xsd:complexType name="scxmlmessages.messages.type">
        <xsd:group ref="scxmlmessages.messages.content" />
        <xsd:attributeGroup ref="scxmlmessages.messages.attlist" />
    </xsd:complexType>
    <xsd:element name="messages" type="scxmlmessages.messages.type" />
</xsd:schema>

F.2 E.2 Basic HTTP Event I/O Processor

The Basic HTTP Event I/O Processor is intended as a minimal interoperable mechanism for sending and receiving events between external components and SCXML 1.0 implementations. Support for the Basic HTTP Event I/O Processor is optional, but implementations that implement this processor MUST support sending and receiving messages in the SCXML message format using it(). it( http://www.w3.org/2011/04/SCXML/scxml-message.xsd ).

F.2.1 E.2.1 Access URI

The access URI for the Basic HTTP Event I/O Processor is the URI to which an external component can send an event for injection into an active session.

The access URI is available via the system variable _ioprocessors using the key "basichttp". For example, in E.2 D.2 The ECMAScript Data Model , _ioprocessors["basichttp"] returns the access URI (e.g. http://www.example.com/scxml/basichttp) for the basichttp processor.

The access URI for the Basic HTTP Event I/O Processor may be sent to external components by, for example, its inclusion in the namelist attribute of the <send> element. The access URI may also be specified in an implementation-specific manner (for example, product documentation).

F.2.2 E.2.2 Receiving Events

Input An SCXML Processor that supports the Basic HTTP Event I/O Processor MUST accept messages from external components can be received by the SCXML implementation at the basichttp access URI as HTTP POST requests (see [HTTP] ). The SCXML Processor MUST validate the message it receiveds and then MUST build the appropriate SCXML event and MUST add it to the appropriate event queue.

If the HTTP parameter '_content' is present, the SCXML Processor MUST interpret its value will be interpreted as a message in the SCXML message format (). Such messages are mapped ( http://www.w3.org/2011/04/SCXML/scxml-message.xsd ). The SCXML Processor MUST map such a message to an SCXML events event as described in F.1 E.1 SCXML Event I/O Processor . Implementations An SCXML Processor MAY accept other parameters as well. In such cases, the mapping of their values to SCXML events is implementation-specific.

The Basic HTTP Event I/O Processor validates the message After it has received, builds the appropriate SCXML event and adds it the received message to the appropriate event queue. It queue, the SCXML Processor MUST then indicates indicate the result to the external component via a success response code 2XX. Note that this response is sent before the event is removed from the queue and processed. In the cases where the message cannot be formed into an SCXML event, the processor Processor MUST return an HTTP error code as defined in [HTTP] . The following codes are assigned a more specific meaning in the SCXML context:

  • 400 (Bad Request). Message structure is invalid.
  • 403 (Forbidden). Session id does not match an existing SCXML session id.

F.2.3 E.2.3 Sending Events

Events can be sent from the SCXML implementation to an external component with the Basic HTTP Event I/O Processor using the <send> element (see 6.2 <send> ) with the type attribute set to "basichttp". The "basichttp" and the target attribute is set to the access URI of the external component.

The SCXML Processor MUST attempt deliver the message using HTTP method is "POST" and with parameter values are encoded by default in an application/x-www-form-urlencoded body (POST method). This default encoding An SCXML Processor MAY support other encodings, and allow then to be overriden specified in a platform-specific way, e.g. by using the 'hints' attribute. way.

If the namelist attribute is defined, the SCXML Processor MUST map its variable names and values are mapped to HTTP parameters. If one or more <param> children are present, the SCXML Processor MUST map their names (i.e. name attributes) and values are mapped to HTTP parameters. If a <content> child is present, the SCXML Processor MUST map its value is mapped to the distinguished HTTP parameter '_content'.

If the external component returns any HTTP response code other than 2XX, the implementation will raise SCXML Processor MUST place the error error.communication in on the internal event queue of the session that attempted to send the event.

F.3 E.3 DOM Event I/O Processor

The DOM Event I/O processor handles communication between SCXML markup and markup in other namespaces in mixed-markup XML documents. An example of this would be a document containing both SCXML and HTML markup. In such a case, each language retains its own context and its own independent semantics. (For example, SCXML's event processing algorithm is not affected by the fact that there is HTML markup elsewhere in the document.) It is however useful for the two languages to be able to communicate by sending events back and forth, so that the HTML markup can notify SCXML when the user clicks on a button, and the SCXML markup can notify HTML when it is time to place a certain field in focus, etc. The DOM Event I/O processor handles this communication by means of DOM Events [DOMEvents] , which are a general means for information propagation in XML documents.

G F Related Work

A number of other XML-based state machine notations have been developed, but none serves the same purpose as SCXML. XMI [UML XMI] is a notation developed for representing UML diagrams, including Harel State charts. However it is intended as a machine interchange format and is not readily authorable by humans. ebXML [OASIS ebXML] is a language for business process specification intended to support B2B e-commerce applications. It contains a state machine language that is in some ways similar to the one presented here, but its syntax and semantics are closely tied to its intended use in e-commerce. It is therefore not suitable as a general-purpose state machine language. XTND [XTND] , also called XML Transition Network Definition, is a notation for simple finite state machines but lacks Harel's notions of hierarchical and parallel states and are thus not suitable for a general-purpose state machine that is semantically equivalent to Harel statecharts.

This section is informative.

H G Examples

H.1 G.1 Language Overview

This SCXML document gives an overview of the SCXML language and shows the use of its state machine transition flows:

<?xml version="1.0" encoding="us-ascii"?>
<!-- A wrapper state that contains all other states in this file
- it represents the complete state machine --> 
<scxml xmlns="http://www.w3.org/2005/07/scxml"
       version="1.0"
       initial="Main"
       datamodel="ecmascript">
  <state id="Main">
    <!-- its initial state is Test1 -->
    <initial>
      <transition target="Test1"/>
    </initial>
    <!-- Really simple state showing the basic syntax. -->
    <state id="Test1">
      <initial>
        <transition target="Test1Sub1"/>
      </initial>
      <!-- Runs before we go into the substate -->
      <onentry> 
        <log expr="'Inside Test1'"/>
      </onentry>
      <!-- Here is our first substate -->
      <state id="Test1Sub1">
        <onentry>
          <log expr="'Inside Test1Sub1.'"/>
        </onentry>
        <onexit>
          <log expr="'Leaving Test1Sub1'"/>
        </onexit>
        <!-- Go to Sub2 on Event1 -->
        <transition event="Event1" target="Test1Sub2"/>
      </state>
      <!-- Here is the second substate 
           It is final, so Test1 is done when we get here -->
      <final id="Test1Sub2"/>
      <!-- We get this event when we reach Test1Sub2. -->
      <transition event="Test1.done" target="Test2"/>
      <!-- We run this on the way out of Test1 -->
      <onexit>
        <log expr="'Leaving Test1...'"/>
      </onexit>
    </state>
    <state id="Test2">
      <initial>
        <transition target="Test2Sub1"/>
      </initial>
      <!-- This time we reference a state 
           defined in an external file.   -->
       <xi:include href="SCXMLExamples/Test2Sub1.xml" parse="text"/>
  
      <final id="Test2Sub2"/>
      <!-- Test2Sub2 is defined as final, so this
           event is generated when we reach it -->
      <transition event="done.state.Test2" next="Test3"/>
    </state>
    <state id="Test3">
      <initial>
        <transition target="Test3Sub1"/>
      </initial>
      <state id="Test3Sub1">
        <onentry>
          <log expr="'Inside Test3Sub1...'"/>
          <!-- Send our self an event in 5s -->
          <send event="'Timer'"  delay="'5s'"/>
        </onentry>
        <!-- Transition on to Test4.
             This will exit both us and our parent. -->
        <transition event="Timer" target="Test4"/>
        <onexit>
          <log expr="'Leaving Test3Sub1...'"/>
        </onexit>
      </state>
      <onexit>
        <log expr="'Leaving Test3...'"/>
      </onexit>
    </state>
    
    <state id="Test4">
      <onentry>
        <log expr="'Inside Test4...'"/>
      </onentry>
      <initial>
        <transition target="Test4Sub1"/>
      </initial>
      <state id="Test4Sub1">
        <onexit>
          <log expr="'Leaving Test4Sub1...'"/>
        </onexit>
        <!-- This transition causes the state to exit immediately
             after entering Test4Sub1.  The transition has no event
             or guard so it is always active -->
        <transition target="Test5"/>
      </state>
    </state>
       
    <state id="Test5">
      <onentry>
        <log expr="'Inside Test5...'"/>
      </onentry>
      <initial>
        <transition target="Test5P"/>
      </initial>
      <!-- Fire off parallel states.  In a more realistic example
      the parallel substates Test5PSub1 and Test5PSub2 would themselves
      have substates and would do some real work before transitioning to final substates -->
      <parallel id="Test5P">
        <state id="Test5PSub1" initial="Test5PSub1Final">
           <final id="Test5PSub1Final"/>
           </state>
        <state id="Test5PSub2" initial="Test5PSub2Final">
            <final id="Test5PSub2Final"/>
            </state>
        <onexit>
          <log expr="'all parallel states done'"/>
        </onexit>
      </parallel>
      <!-- The parallel states immediately transition to final substates,
      so this event is generated immediately.   -->
      <transition event="done.state.Test5P" target="Test6"/>
    </state>
    <!-- 
         - This state shows invocation of an external component.
         - We will use CCXML + VoiceXML actions as an example 
         - as it is a good smoke test to show how it all 
         - fits together. 
         - Note: In a real app you would likely 
         - split this over several states but we 
         - are trying to keep it simple here. 
    -->
    <state id="Test6"
           xmlns:ccxml="http://www.w3.org/2002/09/ccxml"
           xmlns:v3="http://www.w3.org/2005/07/vxml3">
      <datamodel>
        <data name="ccxmlid" expr="32459"/>
        <date name="v3id" expr="17620"/>
        <data name="dest" expr="'tel:+18315552020'"/>
        <data name="src" expr="'helloworld2.vxml'"/>
        <data name="id" expr="'HelloWorld'"/>
      </datamodel>
      <onentry>
        <!-- Use <send> a message to a CCXML Processor asking it to run createcall -->
        <send target="ccxmlid" type="basichttp" event="ccxml:createcall" namelist="dest"/>
      </onentry>
      <transition event="ccxml:connection.connected">      
        <!-- Here as a platform-specific extension we use example V3 
             Custom Action Elements instead of send. The implementation of this logic 
             would be platform-dependent. -->
        <v3:form id="HelloWorld">
          <v3:block><v3:prompt>Hello World!</v3:prompt></v3:block>          
        </v3:form>
      </transition>
      <transition event="v3:HelloWorld.done">
        <!-- Here we are using the low level <send> 
             element to run a v3 form. Note that the event "v3:HelloWorld.done" 
             is assumed either to be set/sent explicitly by the v3:form code or 
             implicitly by some process outside of the v3:form -->
        <send target="v3id" type="basichttp" event="v3:formstart" namelist="src id"/>
      </transition>
      <transition event="v3:HelloWorld2.done">
        <!-- we use _event.data to access data in the event we're processing.
             Again we assume the v3:HelloWorld2.done is set/sent from outside
             this document -->
        <ccxml:disconnect connectionid="_event.data.connectionid"/>      
      </transition>
      <transition event="ccxml:connection.disconnected" target="Done"/>
  
      <transition event="send.failed" target="Done">
        <!-- If we get an error event we move to the Done state that 
             is a final state. -->
        <log expr="'Sending to and External component failed'"/>
      </transition>
      <onexit>
        <log expr="'Finished with external component'"/>
      </onexit>
    </state>
    <!-- This final state is an immediate child of Main
         -  when we get here, Main.done is generated. -->
    <final id="Done"/>
    <!-- End of Main > -->
  </state>
</scxml>

H.3 G.3 Microwave Example (Using parallel)

The example below shows the implementation of a simple microwave oven using <parallel> and the SCXML In() predicate.

H.4 G.4 Calculator Example

The example below shows the implementation of a simple calculator in SCXML.

<?xml version="1.0" ?>
<scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0"
       initial="on" datamodel="ecmascript" name="calc">
    <datamodel>
         <data id="long_expr" />
         <data id="short_expr" expr="0" />
         <data id="res" />
    </datamodel>
    <state id="on" initial="ready">
        <onentry>
            <send event="DISPLAY.UPDATE" />
        </onentry>
        <state id="ready" initial="begin">
        <state id="begin">
            <transition event="OPER.MINUS" target="negated1" />
            <onentry>
                <send event="DISPLAY.UPDATE" />
            </onentry>
        </state>
        <state id="result">
        </state>
            <transition event="OPER" target="opEntered" />
            <transition event="DIGIT.0" target="zero1">
                <assign dataid="short_expr" expr="''" />

                <assign location="short_expr" expr="''" />

            </transition>
            <transition event="DIGIT" target="int1">
                <assign dataid="short_expr" expr="''" />

                <assign location="short_expr" expr="''" />

            </transition>
            <transition event="POINT" target="frac1">
                <assign dataid="short_expr" expr="''" />

                <assign location="short_expr" expr="''" />

            </transition>
        </state>
        <state id="negated1">
            <onentry>
                <assign dataid="short_expr" expr="'-'" />

                <assign location="short_expr" expr="'-'" />

                <send event="DISPLAY.UPDATE" />
            </onentry>
            <transition event="DIGIT.0" target="zero1" />
            <transition event="DIGIT" target="int1" />
            <transition event="POINT" target="frac1" />
        </state>
        <state id="operand1">
            <state id="zero1">
                <transition event="DIGIT" cond="_event.name != 'DIGIT.0'" target="int1" />
                <transition event="POINT" target="frac1" />
            </state>
            <state id="int1">
                <transition event="POINT" target="frac1" />
                <transition event="DIGIT">
                    <assign dataid="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <assign location="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <send event="DISPLAY.UPDATE" />
                </transition>
                <onentry>
                    <assign dataid="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <assign location="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <send event="DISPLAY.UPDATE" />
                </onentry>
            </state>
            <state id="frac1">
                <onentry>
                    <assign dataid="short_expr" expr="short_expr+'.'" />

                    <assign location="short_expr" expr="short_expr+'.'" />

                    <send event="DISPLAY.UPDATE" />
                </onentry>
                <transition event="DIGIT">
                    <assign dataid="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <assign location="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <send event="DISPLAY.UPDATE" />
                </transition>
            </state>
            <transition event="OPER" target="opEntered" />
        </state>
        <state id="opEntered">
            <transition event="OPER.MINUS" target="negated2" />
            <transition event="POINT" target="frac2" />
            <transition event="DIGIT.0" target="zero2" />
            <transition event="DIGIT" target="int2" />
            <onentry>
                <raise event="CALC.SUB" />
                <send target="_internal" event="OP.INSERT">
                    <param name="operator" expr="_event.name" />
                </send>
            </onentry>
        </state>
        <state id="negated2">
            <onentry>
                <assign dataid="short_expr" expr="'-'" />

                <assign location="short_expr" expr="'-'" />

                <send event="DISPLAY.UPDATE" />
            </onentry>
            <transition event="DIGIT.0" target="zero2" />
            <transition event="DIGIT" target="int2" />
            <transition event="POINT" target="frac2" />
        </state>
        <state id="operand2">
            <state id="zero2">
                <transition event="DIGIT" cond="_event.name != 'DIGIT.0'" target="int2" />
                <transition event="POINT" target="frac2" />
            </state>
            <state id="int2">
               <transition event="DIGIT">
                    <assign dataid="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <assign location="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <send event="DISPLAY.UPDATE" />
                </transition>
                <onentry>
                    <assign dataid="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <assign location="short_expr" expr="short_expr+_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <send event="DISPLAY.UPDATE" />
                </onentry>
                <transition event="POINT" target="frac2" />
            </state>
            <state id="frac2">
                <onentry>
                    <assign dataid="short_expr" expr="short_expr +'.'" />

                    <assign location="short_expr" expr="short_expr +'.'" />

                    <send event="DISPLAY.UPDATE" />
                </onentry>
                <transition event="DIGIT">
                    <assign dataid="short_expr" expr="short_expr +_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <assign location="short_expr" expr="short_expr +_event.name.substr(_event.name.lastIndexOf('.')+1)" />

                    <send event="DISPLAY.UPDATE" />
                </transition>
            </state>
            <transition event="OPER" target="opEntered">
                <raise event="CALC.SUB" />
                <raise event="OP.INSERT" />
            </transition>
            <transition event="EQUALS" target="result">
                <raise event="CALC.SUB" />
                <raise event="CALC.DO" />
            </transition>
        </state>
        <transition event="C" target="on" />
    </state>
    <transition event="CALC.DO">
        <assign dataid="short_expr" expr="''+ res" />
        <assign dataid="long_expr" expr="''" />
        <assign dataid="res" expr="0" />

        <assign location="short_expr" expr="''+ res" />
        <assign location="long_expr" expr="''" />
        <assign location="res" expr="0" />

    </transition>
    <transition event="CALC.SUB">
        <if cond="short_expr!=''">
            <assign dataid="long_expr" expr="long_expr+'('+short_expr+')'" />

            <assign location="long_expr" expr="long_expr+'('+short_expr+')'" />

        </if>
        <assign dataid="res" expr="eval(long_expr)" />
        <assign dataid="short_expr" expr="''" />

        <assign location="res" expr="eval(long_expr)" />
        <assign location="short_expr" expr="''" />

        <send event="DISPLAY.UPDATE" />
    </transition>
    <transition event="DISPLAY.UPDATE">
        <log level="0" label="'result'" expr=".short_expr==''?res:short_expr" />
    </transition>
    <transition event="OP.INSERT">
        <log level="0" expr="_event.data[0]" />
        <if cond="_event.data[0] == 'OPER.PLUS'">
            <assign dataid="long_expr" expr="long_expr+'+'" />

            <assign location="long_expr" expr="long_expr+'+'" />

        <elseif cond="_event.data[0]=='OPER.MINUS'" />
            <assign dataid="long_expr" expr="long_expr+'-'" />

            <assign location="long_expr" expr="long_expr+'-'" />

        <elseif cond="_event.data[0]=='OPER.STAR'" />
            <assign dataid="long_expr" expr="long_expr+'*'" />

            <assign location="long_expr" expr="long_expr+'*'" />

        <elseif cond="_event.data[0]=='OPER.DIV'" />
            <assign dataid="long_expr" expr="long_expr+'/'" />

            <assign location="long_expr" expr="long_expr+'/'" />

        </if>
    </transition>
</scxml>

H.5 G.5 Shale Example

The example below, which is from the Apache Shale Project. Shale is a web application framework based on JavaServer Faces (JSF). It's composed of loosely coupled services that provide functionality such as application event callbacks, dialogs with conversation-scoped state, a view technology called Clay, annotation-based functionality to reduce configuration requirements and support for remoting. For more information on Shale please see http://shale.apache.org/ . SCXML is used as a "dialog manager" service in Shale (for details on the integration of SCXML in Shale please see http://shale.apache.org/shale-dialog-scxml/index.html ). It allows Shale application authors to express navigation across multiple JSF views and/or other conversations with users of a JSF application using the SCXML markup notation. The example below describes how the navigation across multiple JSF views can be expressed using SCXML. It also shows how a submachine (edit-profile-config.scxml) can be used within an SCXML file. The binding language used in these examples is EL [EL] , which is the expression language supported in the JSF environment.

UML diagram for this example
<?xml version="1.0" encoding="UTF-8"?>
<!--
  Dialog definitions for Shale Use Cases Example Web Application
  written out as SCXML to demonstrate use of Commons SCXML as one
  of Shale's Dialog Manager implementations.
  For details, see: http://shale.apache.org/shale-dialog-scxml/
-->
<scxml xmlns="http://www.w3.org/2005/07/scxml" xmlns:my="http://scxml.example.com/"
       version="1.0" initial="edit" datamodel="el">
  <state id="edit">
    <initial>
      <transition target="setup"/>
    </initial>
    <!-- global transitions (within state "edit") -->
    <transition event="faces.outcome" cond="${outcome eq 'cancel'}" target="cancel"/>
    <transition event="faces.outcome" cond="${outcome eq 'finish'}" target="finish"/>
    <state id="setup">
      <onentry>
        <my:var name="setupOutcome" expr="#{profile$edit.setup}" />
      </onentry>
      <transition cond="${setupOutcome eq 'success'}" target="page1"/>
    </state>
    <state id="page1">
      <transition event="faces.outcome" cond="${outcome eq 'next'}" target="page2"/>
    </state>
    <state id="page2">
      <transition event="faces.outcome" cond="${outcome eq 'previous'}" target="page1"/>
      <transition event="faces.outcome" cond="${outcome eq 'next'}" target="page3"/>
    </state>
    <state id="page3">
      <transition event="faces.outcome" cond="${outcome eq 'previous'}" target="page2"/>
      <transition event="faces.outcome" cond="${outcome eq 'next'}" target="editExit"/>
    </state>
  </state>
  <state id="cancel">
  <onentry>
      <my:var name="cancelOutcome" expr="#{profile$edit.cancel}" />
    </onentry>
    <transition cond="${cancelOutcome eq 'success'}" target="editExit">
      <my:var name="outcome" expr="cancel"/>
    </transition>
  </state> 
  <state id="finish">
    <onentry>
      <my:var name="finishOutcome" expr="#{profile$edit.finish}" />
    </onentry>
    <transition cond="${finishOutcome eq 'username'}" target="page1"/>
    <transition cond="${finishOutcome eq 'password'}" target="page1"/>
    <transition cond="${finishOutcome eq 'success'}" target="editExit">
      <my:var name="outcome" expr="success"/>
    </transition>
  </state>
  <final id="editExit"/>
</scxml>

H.6 G.6 Examples of Invoke and finalize

The following two SCXML documents demonstrate the use of Invoke and finalize. The first example shows the control flow for a voice portal offering traffic reports.

<?xml version="1.0"?>
<?access-control allow="*"?>
<scxml version="1.0" initial="Intro" datamodel="ecmascript">
  <state id="Intro">
    <invoke src="dialog.vxml#Intro" type="vxml2"/>
    <transition event="success" cond="sessionChrome.playAds" target="PlayAds"/>
    <transition event="success" cond="!sessionChrome.playAds &amp;&amp; ANIQuality" 
                    target="ShouldGoBack"/>
    <transition event="success" cond="!sessionChrome.playAds &amp;&amp; !ANIQuality" 
                    target="StartOver"/>
  </state>
  <state id="PlayAds">
    <invoke src="dialog.vxml#PlayAds" type="vxml2"/>
    <transition event="success" cond="ANIQuality" target="ShouldGoBack"/>
    <transition event="success" cond="!ANIQuality" target="StartOver"/>
  </state>
  <state id="StartOver">
    <onenter>
      <script>enterStartOver();</script>
    </onenter>
    <invoke src="dialog.vxml#StartOver" type="vxml2">
      <param name="gotItFromANI" expr="gotItFromANI"/>
      <finalize>
        <script>finalizeStartOver();</script>
      </finalize>
    </invoke>
    <transition event="success" target="ShouldGoBack"/>
    <transition event="doOver" target="StartOver"/>
    <transition event="restart" target="Intro"/> <!-- bail out to caller -->
  </state>
  <state id="ShouldGoBack">
    <invoke src="dialog.vxml#ShouldGoBack" type="vxml2">
      <param name="cityState" expr="cityState"/>
      <param name="gotItFromANI" expr="gotItFromANI"/>
      <finalize>
        <script>finalizeShouldGoBack();</script>
      </finalize>
    </invoke>
    <transition event="highWay" target="HighwayReport"/>
    <transition event="go_back" target="StartOver"/>
    <transition event="doOver" target="ShouldGoBack"/>
    <transition event="restart" target="Intro"/>
  </state>
  <state id="HighwayReport">
    <invoke src="dialog.vxml#HighwayReport" type="vxml2">
      <param name="cityState" expr="cityState"/>
      <param name="gotItFromANI" expr="gotItFromANI"/>
      <param name="playHRPrompt" expr="playHRPrompt"/>
      <param name="metroArea" expr="metroArea"/>
      <finalize>
        <script>finalizeHighwayReport();</script>
      </finalize>
    </invoke>
    <transition event="highway" target="PlayHighway"/>
    <transition event="go_back" target="StartOver"/>
    <transition event="doOver" target="HighwayReport"/>
    <transition event="fullreport" target="FullReport"/>
    <transition event="restart" target="Intro"/>
  </state>
  <state id="FullReport">
    <invoke src="dialog.vxml#FullReport" type="vxml2">
      <param name="cityState" expr="cityState"/>
      <param name="metroArea" expr="metroArea"/>
      <finalize>
        <script>finalizeFullReport();</script>
      </finalize>
    </invoke>
    <transition event="go_back" target="HighwayReport"/>
    <transition event="new_city" target="StartOver"/>
  </state>
  <state id="PlayHighway">
    <invoke src="dialog.vxml#PlayHighway" type="vxml2">
      <param name="cityState" expr="cityState"/>
      <param name="curHighway" expr="curHighway"/>
      <finalize>
        <script>finalizePlayHighway();</script>
      </finalize>
    </invoke>
    <transition event="go_back" target="HighwayReport"/>
  </state>
</scxml>

The following example shows a the control flow for a blackjack game.

<?xml version="1.0"?>
<?access-control allow="*"?>
<scxml version="1.0" datamodel="ecmascript" initial="master"> <state id="master">
    <initial id="init1">
      <transition target="_home"/>
    </initial>
    <transition event="new_dealer" target="NewDealer"/>
    <transition event="mumble" target="_home"/> <!-- bail out to caller -->
    <transition event="silence" target="_home"/> <!-- bail out to caller -->
    <state id="_home">
      <onenter>
        <script>
        _data = {};
        </script>
      </onenter>
      <invoke src="datamodel.v3#InitDataModel" type="vxml3">
        <finalize>
          <script>
          var n;
          for (n in event) {
              _data[n] = event[n];
          }
          </script>
        </finalize>
      </invoke>
      <transition event="success" target="Welcome"/>
    </state>
    <state id="Welcome">
      <invoke src="dialog.vxml#Welcome" type="vxml3">
        <param name="skinpath" expr="skinpath"/>
      </invoke>
      <transition event="success" target="Intro2"/>
    </state>
    <state id="Intro2">
      <invoke src="dialog.vxml#Intro2" type="vxml3">
        <param name="skinpath" expr="skinpath"/>
      </invoke>
      <transition event="success" target="EvalDeal"/>
    </state>
    <state id="EvalDeal">
      <onenter>
        <script>enterEvalDeal();</script>
      </onenter>
      <invoke src="dialog.vxml#EvalDeal" type="vxml3">
        <param name="skinpath" expr="skinpath"/>
        <param name="playercard1" expr="playercard1"/>
        <param name="playercard2" expr="playercard2"/>
        <param name="playertotal" expr="blackjack.GetTotalOf('caller').toString()"/>
        <param name="dealercardshowing" expr="dealercardshowing"/>
      </invoke>
      <transition event="success" target="AskHit"/>
    </state>
    <state id="AskHit">
      <invoke src="dialog.vxml#AskHit" type="vxml3">
        <param name="skinpath" expr="skinpath"/>
        <finalize>
          <script>finalizeAskHit();</script>
        </finalize>
      </invoke>
      <transition event="hit" target="PlayNewCard"/>
      <transition event="stand" target="PlayDone"/>
    </state>
    <state id="PlayNewCard">
      <invoke src="dialog.vxml#PlayNewCard" type="vxml3">
        <param name="skinpath" expr="skinpath"/>
        <param name="playernewcard" expr="playernewcard"/>
        <param name="playertotal" expr="blackjack.GetTotalOf('caller').toString()"/>
      </invoke>
      <transition event="success" cond="blackjack.GetTotalOf('caller') &gt;= 21" target="PlayDone"/>
      <transition event="success" target="AskHit"/> <!-- less than 21 -->
    </state>
    <state id="PlayDone">
      <onenter>
        <script>enterPlayDone();</script>
      </onenter>
      <invoke src="dialog.vxml#PlayDone" type="vxml3">
        <param name="skinpath" expr="skinpath"/>
        <param name="gameresult" expr="blackjack.GetGameResult()"/>
        <param name="dealertotal" expr="blackjack.GetTotalOf('dealer').toString()"/>
      </invoke>
      <transition event="playagain" target="Intro2"/>
      <transition event="quit" target="_home"/>
    </state>
    <state id="NewDealer">
      <onenter>
       <script>enterNewDealer();</script>
      </onenter>
      <invoke src="dialog.vxml#Dummy" type="vxml3"/>
      <transition event="success" target="Welcome"/>
    </state>
  </state>
</scxml>

H.7 G.8 Custom Action Elements

Custom Action Elements can be defined in other specifications/namespaces and are responsible for performing actions on behalf of custom components. Logically Custom Action Elements can be thought of as a collection of actions and handlers to perform specific tasks. An example of this is a CCXML <accept> element that is a Custom Action Element:

<transition event="ccxml:connection.alerting">
  <ccxml:accept connectionid="_event.data.connectionid"/>
</transition>

This could be written using a <send> element using the following syntax:

<datamodel>
<data name="connectionid"/>
</datamodel>
<transition event="ccxml:connection.alerting">
  <assign name="connectionid" expr="_event.data.connectionid"/>
 <send type="ccxml" event="ccxml:accept" namelist="connectionid"/> 
</transition>

A more complicated example might be a CCXML <createcall> where you are both providing variables and getting values back that using only the <send> syntax would be more complex as it would need to be broken over several steps. For example:

<onentry>
  <ccxml:createcall dest="'tel:+18315552020'" connectionid="myConnectionID"/> 
</onentry>

Would need to be modeled in two steps using <send> as you would need to do something like the following:

<datamodel>
  <data name="dest" expr="'tel:+18315552020'"/>
  <data name="connectionid"/>
</datamodel>
<onentry>
  <send type="ccxml" event="ccxml:createcall" namelist="dest"/>
</onentry>
<transition event="ccxml:createcall.success">
   <assign name="connectionid" expr="_event.data.connectionid"/>
</transition>

The exact mappings between Custom Action Elements and <send> actions are to be defined in the individual Custom Action Element specifications.

I H References

CSS2
Cascading Style Sheets, level 2: CSS2 Specification . B. Bos, et al., Editors. World Wide Web Consortium, 12 May 1998. This version of the CSS2 Recommendation is http://www.w3.org/TR/1998/REC-CSS2-19980512/. The latest version of CSS2 is available at http://www.w3.org/TR/REC-CSS2/. (See http://www.w3.org/TR/1998/REC-CSS2-19980512/.)
OASIS ebXML
ebXML Business Process Specification Schema v2.0 . (See http://www.oasis-open.org/committees/documents.php?wg_abbrev=ebxml-bp.)
DOMEvents
EDocument Object Model (DOM) Level 3 Events Specification W3C Working Draft, September 2009. (See http://www.w3.org/TR/DOM-Level-3-Events/.)
ECMASCRIPT-262
ECMAScript Language Specification Standard ECMA-262, 3rd Edition, December 1999. (See http://www.ecma-international.org/publications/standards/Ecma-262.htm.)
ECMASCRIPT-327
ECMAScript 3rd Edition Compact Profile Standard ECMA-327, July 2001. (See http://www.ecma-international.org/publications/standards/Ecma-327.htm.)
E4X
ECMAScript for XML (E4X) Specification Standard ECMA-357, 2nd Edition, December 2005. (See http://www.ecma-international.org/publications/standards/Ecma-357.htm.)
EL
EL: The JSP 2.0 Expression Language Interpreter (See http://commons.apache.org/el/.)
Harel and Politi
Modeling Reactive Systems with Statecharts: The STATEMATE Approach By D. Harel and M. Politi. McGraw-Hill, 1998. (See http://www.wisdom.weizmann.ac.il/~dharel/reactive_systems.html.)
IETF RFC 2119
RFC 2119: Key words for use in RFCs to Indicate Requirement Levels . Internet Engineering Task Force, 1997. (See http://www.ietf.org/rfc/rfc2119.txt.)
IETF RFC 2396
RFC 2396: Uniform Resource Identifiers . Internet Engineering Task Force, 1995. (See http://www.ietf.org/rfc/rfc2396.txt.)
W3C CCXML 1.0
Voice Browser Call Control: CCXML Version 1.0 . W3C, 2005. (See http://www.w3.org/TR/2005/WD-ccxml-20050111/.)
HTTP
CMultimodal Architecture and Interfaces Working Draft . W3C, 2005. (See http://www.ietf.org/rfc/rfc2616.txt.)
JSON
The application/json Media Type for JavaScript Object Notation (JSON) RFC 4627, July 2006. (See http://www.ietf.org/rfc/rfc4627.txt.)
W3C MMI
"Hypertext Transfer Protocol -- HTTP/1.1 " . IETF RFC 2616, 199. (See http://www.w3.org/TR/mmi-arch/.)
RFC2616
Hypertext Transfer Protocol -- HTTP/1.1 IETF RFC 2616, 1999. (See http://www.ietf.org/rfc/rfc2616.txt.)
RFC2617
HTTP Authentication: Basic and Digest Access Authentication IETF RFC 2617, June 1999. (See http://www.ietf.org/rfc/rfc2617.txt.)
W3C VoiceXML 2.0
VoiceXML 2.0: . W3C, 2004. (See http://www.w3.org/TR/voicexml20/.)
UML 2.3
UML Specification Version 2.3 . OMG, 2009. (See http://www.omg.org/spec/UML/2.3/.)
UML XMI
XML Metadata Exchange version 2.1 . (See http://www.omg.org/technology/documents/modeling_spec_catalog.htm#XMI.)
XInclude
XML Inclusions (XInclude) Version 1.0 . W3C, 2006. (See http://www.w3.org/TR/xinclude/.)
XML
Extensible Markup Language (XML) 1.0 (Fourth Edition) T. Bray et. al. eds. World Wide Web Consortium 16 August 2006 (See http://www.w3.org/TR/xml/.)
XML ID
xml:id version 1.0 J. Marsh, D. Veillard, N. Walsh. World Wide Web Consortium, 9 September 2005. (See http://www.w3.org/TR/2005/REC-xml-id-20050909/.)
XMLNames
Namespaces in XML 1.0 (Second Edition) T. Bray, D. Hollander, A. Layman, R. Tobin, Editors, W3C Recommendation, 16 August 2006 (See http://www.w3.org/TR/2006/REC-xml-names-20060816/.)
XML Schema
XML Schema Part 2: Datatypes Second Edition P. Biron and A. Malhotra. World Wide Web Consortium, 28 October 2004. (See http://www.w3.org/TR/xmlschema-2/.)
XPath 2.0
XML Path Language (XPath) 2.0 A. Berglund, S. Boag, D. Chamberlin, M. Fernández, M. Kay, J. Robie, J. Siméon, January 2007 (See http://www.w3.org/TR/xpath20/.)
XPath 2.0 Functions and Operators
XQuery 1.0 and XPath 2.0 Functions and Operators A. Malhotra, J. Melton, N. Walsh, January 2007 (See http://www.w3.org/TR/xpath-functions/.)
XTND
XML Transition Network Definition . (See http://www.w3.org/TR/2000/NOTE-xtnd-20001121/.)