SCXML
SCXML
是一种多元化、基于事件状态的机器语言,其用法主要有几个方面:
VoiceXML 3.0
的基础上发展而来的高级对话语言,可封装为不同的语言模块VoiceXML 3.0
的基础功能之上,还具备了控制数据库连接的功能和商业业务逻辑模块SCXML
集成了VoiceXML 3.0
的所有对话形式,这其中包括键盘鼠标,文字,视觉感官,触觉感受等多种交互形态。其可能包括一些综合技术如口型的阅读(语音识别技术与视觉的结合表现)。语音的输入以键盘作为载体,并且引入多个键盘和多个用户同步编写的功能SCXML
还是CCXML
未来版本的基础架构CCXML
又被称为呼叫中心使用的具有控制功能的计算机电话集成系统。这种集成系统应用计算机屏幕弹出窗口,并提供其他方式的信息交互,例如,在线聊天,发送即时信息等<!-- 基于 SCXML 的计时器实例 -->
<scxml xmlns="http://www.w3.org/2005/07/scxml"
version="1.0"
initialstate="reset">
<state id="reset">
<transition event="watch.start" target="running"/>
</state>
<state id="running">
<transition event="watch.split" target="paused"/>
<transition event="watch.stop" target="stopped"/>
</state>
<state id="paused">
<transition event="watch.unsplit" target="running"/>
<transition event="watch.stop" target="stopped"/>
</state>
<state id="stopped">
<transition event="watch.reset" target="reset"/>
</state>
</scxml>
此状态描述文件中,一共有四个状态:rest
,running
,paused
和 stopped
状态
此状态机的初始状态是 reset 态,是通过 scxml
元素的 initialstate
元素来指定的。这意味当状态机启动时, 最先进入的将会是这个状态。当状态机处于 reset 态的同时有 watch.start
事件发生时,将会触发状态机进行状态迁移,进入 running
态,即计时器运行态
SCXML
规范组成及元素详解SCXML
元素SCXML
文档的最顶层元素,携带了文档版本等相关信息,当前状态机构成以及子元素等initialState
属性来指定状态机的进入初始态,可包含State
、Parallel
、Final
、DataModel
和 Script
子元素State
元素id
和 initial
State
或是 Parallel
子元素的复杂态必须为其指定 initial
属性,用于表示进入此复杂态所应该进入的第一个子状态OnEntry
元素、OnExit
元素、Transition
元素、State
元素、Parallel
元素、DataModel
元素和 Invoke
元素Transition
元素Event
属性,用以表示触发此状态迁移的事件Cond
属性,用以表示此状态迁移进行的限制条件Target
属性,用以表示此状态迁移的目标态Log
元素 <state id="s">
<transition event="e1" cond="x==1" target="s1"/>
<transition event="e2" target="s2">
<log expr="'executing transition'"/>
</transition>
</state>
Parallel
元素State
元素类似,此元素可以包含 OnEntry
元素、OnExit
元素、Transition
元素、State
元素、Parallel
元素、DataModel
元素和 Invoke
元素为子元素Paralle
元素与 State
元素有着不同的语义,当某个 State 元素处于 active
态,其有且只有一个子元素处于 active
态,但是当某个 Parallel
元素处于 active
态时,其所有子元素均处于 active
态OnEntry
元素OnExit
元素OnEntry
元素,此元素也是一个容器元素,用以包含状态机退出某个状态之前所进行的全部操作,其子元素均为可执行模块内容OnEntry
和 OnExit
元素内的可执行元素模块往往和 Transtion
元素里的可执行元素具有等同的作用效果。当状态机执行 Transition
元素时,它将会执行它离开的那个 State
元素的 OnExit
包含的可执行内容模块,当它进入目标 State 元素时,会执行目标态 OnEntry
元素所包含的可执行内容模块Raise
元素
SCXML
引挚必须将此事件放置在当前会话的内部事件序列的尾部If
元素
If
元素具有 cond
属性,当此属性值为 true
时,状态机将会执行该 If
后的事件子元素Else
元素ElseIf
元素Log
元素assign
、validate
和 script
等 <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>
数据模型模块为SCXML
有限状态机提供了内置的数据存储、读写、修改数据集的能力
SCXML
规范中数据模型用 DataModel
元素来表示,其可以包含一个或是多个 Data
元素,每个 Data
元素表示一个数据项,并可以此数据项指定初始值
可以通过 Assign
元素来修改 Data
数据项的值,通过 Validate
元素来验证 Data
数据值的合法性,并且可以通过 Donedata
、Param
等这些元素来完成 Data
元素与外部实例的交互
Datamodel
元素,此元素为容器元素,可以包含一个或是多个 Data
元素,SCXML
通过 Data
元素来完成基本数据项的定义与使用。Data
元素,该元素用来声明和组成 Datamodel
元素,具有必选的 id 属性和可选的 src
和 expr
属性。Data
的 id
属性用来唯一标识某一数据项,通过 src
或是 expr
属性来指定属性值。Assign
元素,此元素用于修改 Data
元素的数据值。具有必选的属性 location
,该属性与 Data
元素的 id
属性对应,用于标识某一数据项。通过可选的 expr
为 Data
元素指定新的数据值。Validate
元素,此元素用于验证 Data
数据值的合法性。当通过 src
为 data
指定外部数据源时,例如 XML
数据源,则可利用此元素和 XML Schema
来验证 Data
数据值的合法性。Donedata
元素,此元素为容器元素,用以装载 SCXML
状态机进入 Final
态时所返回的数据。当 SCXML
引挚进入 Final
态时,会产生一个 done
事件,引挚必须将 Donedata
元素的数据值指定为 _event.data
全局数据值。此元素的子元素可以为 Content
元素或是 Param
元素。Content
元素,此元素为将内嵌数据传送至外部服务的容器元素。Param
元素,此元素提供了一个一般性的用来标识 name/key
或是动态计算的值的方法,该值可传送至外部服务或是被包含在一个事件中。Script
元素,该模块为有限状态机添加了内置脚本的支持。 <scxml version="1.0" datamodel="ecmascript">
<datamodel>
<data id="employees" src="http://example.com/employees.json"/>
<data id="year" expr="2008"/>
<data id="CEO" expr="\"Mr Big\""/>
<data id="profitable" expr="true"/>
</datamodel>
</scxml>
外部交互能力允许 SCXML
会话与外部节点间进行事件的发送或是接收,并且同时提供调用外部服务的能力
Send
元素提供“触发就忘记”的数据传输能力,可以将事件传送至外部环境或是其它的 SCXML
会话。事件传输的细节以及数据格式是 SCXML
引挚所选择的Event I/O Processor
所决定的,每个 SCXML
引挚都会实现一个或是多个 Event I/O Processor
,SCXML
的使用者可以根据需要选择一个他理想的事件 IO
处理器。
会话。事件传输的细节以及数据格式是
SCXML 引挚所选择的
Event I/O Processor所决定的,每个
SCXML 引挚都会实现一个或是多个
Event I/O Processor,
SCXML 的使用者可以根据需要选择一个他理想的事件
IO `处理器。
Invoke
元素提供一种紧藕合的与外部系统进行交互的方式,特别的是提供触发外部平台定义的服务并传送数据的能力,该服务在完成的时候将会产生一个 done
事件。