| VoiceXML文档主要由一些叫做dialog的上层元素组成。VoiceXML有两种对话:form和menu。文档里还可以有<meta>、<metadata>、<var>、<script>、<property>、<catch>和<link>元素。 |
| |
| 一、在一个文档中执行 |
| |
| 文档的执行由默认的第一个对话开始。每个对话在执行的时候,都会指定下一个对话,否则执行中止。 |
| |
| 下面举个“Hello World”的例子来说明它。这个例子里由有一个文档级的变量――hi,它的值为字符串“Hello World!”,是第一个form的提示信息。一旦第一个form播放了“Hello World”,控制会跳转到下一个叫做“say_goodbye”的form,然后播放“Goodbye!”由于第二个form没有跳转到其他的对话,文档退出,执行结束。 |
| |
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
version="2.0">
<meta name="author" content="John Doe"/>
<meta name="maintainer" content="hello-support@hi.example.com"/>
<var name="hi" expr="'Hello World!'"/>
<form>
<block>
<value expr="hi"/>
<goto next="#say_goodbye"/>
</block>
</form>
<form id="say_goodbye">
<block>
Goodbye!
</block>
</form>
</vxml>
|
| |
| 上面的两个form也可以合起来: |
| |
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
version="2.0">
<meta name="author" content="John Doe"/>
<meta name="maintainer" content="hello-support@hi.example.com"/>
<var name="hi" expr="'Hello World!'"/>
<form>
<block>
<value expr="hi"/> Goodbye!
</block>
</form>
</vxml>
|
| |
| 元素<vxml>有如下属性: |
| version | 表示该文档的VoiceXML的版本号(必须的),当前的版本号是2.0。 | | xmlns | 表示给VoiceXML指定的域名空间(必须的)VoiceXML的域名空间是http://www.w3.org/2001/vxml。 | | xml:base | 该文档的基础URI,文档中所有的相对的URI引用都是相对于这个基础URI的。 | | xml:lang | 表示该文档的语言标识符,如果省略,默认的语言为平台特定的语言。 | | application | 表示该文档的应用根文档的URI。 |
|
| 表2:<vxml>元素的属性 |
| |
| 在文档级,语言信息可以通过继承得到:那些有“xml:lang”属性的元素可以继承“xml:lang”的值,例如<grammar>和<prompt>元素,除非这些元素也指定了一个值。 |
| |
| 二、多文档应用的执行 |
| |
| 通常,每个文档都是作为一个孤立的应用运行的。在某些情况下,你想要多个文档作为一个应用一起运行,你可以选择一个文档作为应用根文档(application root document),其他的作为应用叶文档(application leaf document),每个叶文档在它的<vxml>元素里指定根文档。 |
| |
| 这样的话,每次解释器要加载执行该应用的一个叶文档时,如果应用根文档还没有加载,它会先加载应用根文档。应用根文档会一直被加载,直到解释器加载另外一个应用的文档。因此,解释器在解释的时候,下面两个条件,必须满足一个: |
| |
| 1、应用根文档已经加载,且用户正在根文档里执行,没有叶文档被加载。 |
| |
| 2、应用根文档和一个叶文档都被加载,且用户在叶文档里执行。如果各个文档里有定义了一些subdialog,此时可能不止加载一个叶文档,但是只能在其中的一个文档中执行。 |
| |
| 当加载一个叶文档时,虽然根文档也被加载,但是根文档中的对话不会被执行,而是在叶文档中执行。 |
| |
| 多文档应用有几个好处: |
| |
| 1、叶文档可以使用根文档的变量,因此一些信息能够共享,并保留下来; |
| |
| 2、根文档的<property>元素可以给叶文档要用的一些property指定默认值; |
| |
| 3、公有的ECMAScript代码可以放在根文档的<script>元素中,然后在叶文档中使用; |
| |
| 4、根文档中的<catch>元素可以为叶文档指定默认的事件处理; |
| |
| 5、根文档中作用域为document的语法在叶文档中也是激活的,这样用户就可以和根文档中的form、link和menu进行交互。 |
| |
| 下面是一个有两个文档的应用: |
| |
| 应用根文档(app-root.vxml): |
| |
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
version="2.0">
<var name="bye" expr="'Ciao'"/>
<link next="operator_xfer.vxml">
<grammar type="application/srgs+xml" root="root" version="1.0">
<rule id="root" scope="public">operator</rule>
</grammar>
</link>
</vxml>
|
| |
| 叶文档(leaf.vxml): |
| |
<?xml version="1.0" encoding="UTF-8"?>
<vxml xmlns="http://www.w3.org/2001/vxml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/2001/vxml
http://www.w3.org/TR/voicexml20/vxml.xsd"
version="2.0" application="app-root.vxml">
<form id="say_goodbye">
<field name="answer">
<grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
<prompt>Shall we say<value expr="application.bye"/>?</prompt>
<filled>
<if cond="answer">
<exit/>
</if>
<clear namelist="answer"/>
</filled>
</field>
</form>
</vxml>
|
| |
| 在这个例子中,该应用的入口文件是leaf.vxml,因此leaf.vxml先被加载,它的application属性指定app-root.vxml为它的应用根文档,因此接着会加载app-root.vxml。在app-root.vxml中定义了一个变量――bye和一个link,只要用户说“operator”,那么控制就会跳转到operator-xfer.vxml。用户由名为say_goodbye的form开始人机交互。 |
| |
C: Shall we say Ciao?
H: Si.
C: I did not understand what you said. (a platform-specific default message.)
C: Shall we say Ciao?
H: Ciao
C: I did not understand what you said.
H: Operator.
C: (Goes to operator_xfer.vxml, which transfers the caller to a human operator.)
|
| |
| 注意,当用户在多文档的应用里,一次最多只有两个文档同时加载:应用根文档和一个应用叶文档,除非用户正在和应用根文档交互(此时只有一个文档加载,即应用根文档)。根文档的元素不能再指定application属性,而叶文档一定要指定application属性。在多文档的情况下,应用根文档总是被加载的,而应用叶文档则不一定。 |