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属性。在多文档的情况下,应用根文档总是被加载的,而应用叶文档则不一定。 |