文档的结构和执行(1)

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属性。在多文档的情况下,应用根文档总是被加载的,而应用叶文档则不一定。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值