VoiceXML2.0规范 | |||||||||||||||||||||||||
第二章 Dialog的结构 | [第一章 ][前一章 ][后一章 ] | ||||||||||||||||||||||||
第五节 Links | ![]() | ||||||||||||||||||||||||
<link>元素可以有一个或几个语法,语法的作用域为包含该<link>元素的元素。该包含<link>元素的元素的scope属性不会影响<link>元素中语法的作用域。<link>元素被包含于一个<form>元素中,该<form>元素的scope属性为document,该<link>元素语法的作用域在该form内,而不是整个文档。<link>元素中的<grammar>元素是不允许指定scope属性的。当这些语法中的一个被匹配,<link>元素被激活,要么跳转到一个新的文档或dialog(如<goto>),要么抛出一个事件(如<throw>)。 | |||||||||||||||||||||||||
例如,当用户说“books”或按“2”时,<link>元素被激活: | |||||||||||||||||||||||||
<link next="http://www.voicexml.org/books/main.vxml"> <grammar mode="voice" version="1.0" root="root"> <rule id="root" scope="public"> <one-of> <item>books</item> <item>VoiceXML books</item> <one-of> </rule> </grammar> <grammar mode="dtmf" version="1.0" root="r2"> <rule id="r2" scope="public"> 2 </rule> </grammar> </link> | |||||||||||||||||||||||||
当语法被匹配时,下面的<link>元素动态的决定要跳转到当前文档的哪一个dialog: | |||||||||||||||||||||||||
<link expr="'#' + document.helpstate"> <grammar mode="voice" version="1.0" root="root"> <rule id="root" scope="public"> help </rule> </grammar> </link> | |||||||||||||||||||||||||
<link>元素可以是<vxml>和<form>的子元素,或form item<field>和<initial>的子元素。作为<vxml>的子元素,<link>元素的语法在整个文档中都是激活的;作为<form>的子元素,<link>元素的语法在该form中是激活的;如果应用根文档中有一个文档级的<link>元素,它的语法在该应用所有被加载的文档中都是激活的。 | |||||||||||||||||||||||||
如果在一个form item中执行,且该form item的modal属性为true,则form级或文档级的<link>元素的语法是不激活的。 | |||||||||||||||||||||||||
也可以定义一个<link>元素,当语法匹配时抛出一个事件,而不是跳转到一个新的文档或dialog,该事件是在当前执行的地方被抛出,而不是在定义<link>元素的地方被抛出。例如,当用户的输入匹配了<link>元素的语法或用户按键输入了"2",在用户正在访问的form item的地方抛出了help事件,由该form item的作用域内相应的<catch>元素处理(详见5.2.4节)。 | |||||||||||||||||||||||||
<link dtmf="2" event="help"> <grammar mode="voice" version="1.0" root="r5"> <rule id="r5" scope="public"> <one-of> <item>arrgh</item> <item>alas all is lost</item> <item>fie ye froward machine</item> <item>I don't get it</item> <one-of> </rule> </grammar> </link> | |||||||||||||||||||||||||
当匹配了<link>元素中的语法时,application.lastresult$也被赋值,这样才能允许呼叫流程在这个实际的语义结果的基础上往下走。在5.1.5中有一个例子。 | |||||||||||||||||||||||||
从概念上讲,可以认为<link>元素由两部分组成:条件和操作。“条件”就是<link>元素的内容,即它的语法,只有语法被匹配了,才能激活。“操作”由该元素的属性指定,即要跳转到哪里或抛出哪个事件。“条件”是静态地解决/求值的,而“操作”则是动态地解决/求值的。这意味着: | |||||||||||||||||||||||||
1、该<link>元素的内容中的任何URI都是被静态地求值的,即根据定义了<link>元素的文档的基本URI求值(详见1.5.1节的xml:base)。 | |||||||||||||||||||||||||
2、<link>元素属性中的任何URI都是被动态的求值的,即根据语法被匹配时正在执行的文档的基本URI求值。 | |||||||||||||||||||||||||
3、<link>元素的属性中的任何ECMAScript表达式都是被动态地求值的,即在语法被匹配时的作用域内和执行的环境中求值的。 | |||||||||||||||||||||||||
<link>元素的属性有: | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
表26:<link>元素的属性 | |||||||||||||||||||||||||
必须正确的指定属性“next”,“expr”,“event”或“eventexpr”中的一个,否则会抛出一个error.badfetch事件。必须正确的指定属性“message”或“messageexpr”中的一个,否则会抛出一个error.badfetch事件。 | |||||||||||||||||||||||||