第三節(jié) Form Items
|
? |
? |
????form item就是一個(gè)<form>中的元素,該元素在form解釋期間可以被訪問(wèn)。這些元素包括<field>、<block>、<initial>、<subdialog>、<object>、<record>和<transfer>元素。 |
|
????所有的form item都有下面的特點(diǎn): |
|
??????·它們都有一個(gè)變量,由name屬性指定。該變量可以通過(guò)expr屬性獲得初始值。 |
|
??????·它們都有一個(gè)警戒條件,由cond指定。如果一個(gè)form item沒(méi)有被填充,且它的警戒條件沒(méi)有指定或值為true,則該form item可以被訪問(wèn)。 |
|
????Form item可再細(xì)分為input item和control item,前者定義了該form的input item變量,后者用于幫助控制該form的input item的收集。Input item(<field>、<subdialog>、<object>、<record>和<transfer>)一般來(lái)說(shuō)包含下面幾個(gè)元素: |
|
??????·<filled>元素,它包含了一些在相應(yīng)的input item被填充后要執(zhí)行的操作。 |
|
??????·<property>元素,用于指定作用于該input item(<initial>元素也可以包含<property>元素)的property。 |
|
??????·<prompt>元素,用于指定相應(yīng)的元素被訪問(wèn)時(shí)要播放的提示語(yǔ)。 |
|
??????·<grammar>元素,用于指定該input item(<subdialog>不能包含<grammar>元素)允許輸入的語(yǔ)音或DTMF按鍵。 |
|
??????·<catch>元素及它的一些簡(jiǎn)寫(xiě)形式,用于指定作用于該input item(<initial>元素不能包含<catch>元素)的事件處理。 |
|
????每個(gè)input item都有相應(yīng)的一組影子變量。影子變量用于返回一個(gè)input item執(zhí)行后的結(jié)果。而不是返回要存儲(chǔ)于name屬性的值。例如,在<field>的語(yǔ)法識(shí)別結(jié)果中有這次識(shí)別的confidence level(它是一個(gè)影子變量),獲得這個(gè)值對(duì)我們可能有很大的幫助。影子變量的引用可以使用如下這種形式:name$.shadowvar,name就是該input item的name屬性的值,shadowvar就是指定的影子變量名。影子變量是可寫(xiě)的,它的值可以被應(yīng)用更改。例如,<field>返回的影子變量,confidence。下面的例子展示了怎樣訪問(wèn)這個(gè)影子變量。 |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="get_state">
<field name="state">
<prompt>Please say the name of a state. </prompt>
<grammar src="http://mygrammars.example.com/states.gram" type="application/srgs"/>
<filled>
<if cond="state$.confidence < 0.4">
<throw event="nomatch"/>
</if>
</filled>
</field>
</form>
</vxml>
|
|
????在這個(gè)例子中,識(shí)別結(jié)果的confidence要經(jīng)過(guò)檢查,confidence值太低的結(jié)果不會(huì)被接受。 |
? |
一、FIELD |
|
????<field>是一個(gè)form item,用于收集用戶輸入,它的屬性有: |
name |
該form item的form item變量,它的作用域?yàn)閐ialog,它保存了識(shí)別的結(jié)果,在所在的form的form item中,該form item變量名必須是唯一的,如果該變量名不是唯一的,在獲取文檔時(shí)會(huì)拋出error.badfetch事件,該變量名必須符合變量的命名規(guī)則,詳見(jiàn)5.1節(jié)。 |
expr |
該form item變量的初始值,默認(rèn)為ECMAScript 的undefined。如果給它一個(gè)初始值,該form item 將不會(huì)被訪問(wèn),除非它被清零。 |
cond |
一個(gè)表達(dá)式,當(dāng)它的結(jié)果值為true時(shí),該form item才被訪問(wèn)。如果沒(méi)有指定該屬性值,也能被訪問(wèn)。 |
type |
該<field>的類型,即內(nèi)置語(yǔ)法類型的名稱(詳見(jiàn)附錄P)。平臺(tái)對(duì)內(nèi)置語(yǔ)法類型的支持是可選的。如果不支持一個(gè)指定的內(nèi)置語(yǔ)法類型,要拋出一個(gè)error.unsupported.builtin 事件。 |
slot |
語(yǔ)法槽名,用于存放變量(如果沒(méi)有指定,默認(rèn)值為該變量名)。當(dāng)所用的語(yǔ)法格式支持返回一組成對(duì)的槽/值(slot/value)的機(jī)制,且槽名與該form item變量名不同時(shí),該屬性就很有用。 |
modal |
如果它的值為false(默認(rèn)值),在該field的收集階段所有激活的語(yǔ)法都可以匹配;如果它的值為true,則只有該field的語(yǔ)法是允許匹配的,其它的都暫時(shí)失效。 |
|
表9:<field>元素的屬性 |
|
????下表是<field>元素的影子變量(shadow variables),該<field>的form item 變量名為name。影子變量utterance、 inputmode 和 interpretation的值必須和application.lastresult$ (詳見(jiàn)5.1.5節(jié))中相應(yīng)變量的值一樣。 |
name$.utterance |
被識(shí)別的詞的原始串。正確的標(biāo)記和拼寫(xiě)是依賴于平臺(tái)的(例如“five hundred thirty”或“5 hundred 30”或只是“530”)。如果是DTMF語(yǔ)法,該變量將包含匹配的數(shù)字串。 |
name$.inputmode |
用戶輸入的模式,值為dtmf或voice。 |
name$.interpretation |
一個(gè)ECMAscript變量,它包含了用戶輸入的語(yǔ)義解釋,詳見(jiàn)3.1.5。 |
name$.confidence |
該<field>的confidence級(jí)別,它的取值范圍為0.0-1.0,0.0表示最小的confidence,1.0表示最大的confidence。平臺(tái)可以用utterance的confidence (application.lastresult$.confidence的值)作為name$.confidence 的值 ,<field>和utterance 級(jí)別的confidence之間的差別是依賴于平臺(tái)的。 Confidence值更詳細(xì)的解釋是依賴于平臺(tái)的,因?yàn)樗挠?jì)算方法很可能每個(gè)平臺(tái)不一樣。 |
|
表10:<field>元素的影子變量 |
? |
????<一>、使用顯式語(yǔ)法的<field> |
|
????顯示語(yǔ)法可以通過(guò)絕對(duì)的或相對(duì)的URI指定: |
|
<field name="flavor">
<prompt>What is your favorite ice cream?</prompt>
<grammar src="../grammars/ice_cream.grxml" type="application/srgs+xml"/>
</field>
|
|
????也可以指定一個(gè)聯(lián)機(jī)(inline)語(yǔ)法,下面的例子使用了W3C ABNF格式的語(yǔ)法。 |
|
<field name="flavor">
<prompt>What is your favorite flavor?</prompt>
<help>Say one of vanilla, chocolate, or strawberry.</help>
<grammar mode="voice" type="application/srgs">
#ABNF 1.0;
$options = vanilla | chocolate | strawberry
</grammar>
</field>
|
|
????如果同時(shí)指定<grammar>元素的src屬性和聯(lián)機(jī)語(yǔ)法,平臺(tái)會(huì)拋出error.badfetch事件。 |
? |
????<二>、使用依賴于平臺(tái)的內(nèi)置的顯式語(yǔ)法 |
|
????平臺(tái)對(duì)內(nèi)置資源的支持是可選的,如語(yǔ)音語(yǔ)法、DTMF語(yǔ)法和音頻文件。這些資源使用平臺(tái)特有的URI訪問(wèn),例如http://localhost:5000/grammar/boolean,或者使用平臺(tái)特有的方案(scheme),例如通常使用的“builtin”方案,“builtin:grammar/boolean”。如果平臺(tái)支持訪問(wèn)內(nèi)置資源,它應(yīng)該支持訪問(wèn)基本的內(nèi)置語(yǔ)法(見(jiàn)附錄P)。例如: |
|
<grammar src="builtin:grammar/boolean"/>
<grammar src="builtin:dtmf/boolean"/>
|
|
????上面的例子中,第一個(gè)<grammar>引用了內(nèi)置的boolean語(yǔ)音語(yǔ)法,第二個(gè)<grammar>引用了內(nèi)置的boolean的DTMF語(yǔ)法。 |
|
????下面的<field>: |
|
<field type="sample">
<prompt>Prompt for builtin grammar</prompt>
</field>
|
|
????和下面這個(gè)使用平臺(tái)特有的內(nèi)置語(yǔ)法的<field>,效果是一樣的。 |
|
<field>
<grammar src="builtin:grammar/sample"/>
<grammar src="builtin:dtmf/sample"/>
<prompt>Prompt for builtin grammar</prompt>
</field>
|
|
????sample是基本的內(nèi)置<field>的type之一(如,boolean、date等)。 |
|
????另外,依賴于平臺(tái)的內(nèi)置語(yǔ)法的URI可用來(lái)訪問(wèn)特定解釋器環(huán)境支持的語(yǔ)法,我們建議平臺(tái)特有的內(nèi)置語(yǔ)法以“x-”開(kāi)頭命名,因?yàn)樵趯?lái)的正式版本中不會(huì)使用該命名空間。如下: |
|
<grammar src="builtin:grammar/x-sample"/>
<grammar src="builtin:dtmf/x-sample"/>
|
? |
????<三>、使用<option>列表的<field> |
|
????當(dāng)要為<field>指定一組簡(jiǎn)單的可選項(xiàng)時(shí),用<option>列表比用一個(gè)語(yǔ)法方便。<option>列表由包含于<field>元素中的一組<option>元素組成,每個(gè)<option>元素包含了用來(lái)產(chǎn)生語(yǔ)音語(yǔ)法的PCDATA,<option>的語(yǔ)法產(chǎn)生規(guī)則和2.2.5節(jié)中的<choice>一樣。<option>有一個(gè)屬性用于為每個(gè)<option>指定一個(gè)DTMF序列,還有一個(gè)屬性用于控制要賦給該<field>元素的form item變量的值。當(dāng)一個(gè)<option>元素被選定時(shí),它的屬性value的值決定了該<field>的影子變量和application.lastresult$的語(yǔ)義解釋值。 |
|
????下面的例子中的<field>元素給用戶提供了三個(gè)選項(xiàng),把被選定的application.lastresult$元素的value屬性值賦給變量maincource: |
|
<field name="maincourse">
<prompt>
Please select an entree. Today, we are featuring <enumerate/>
</prompt>
<option dtmf="1" value="fish"> swordfish </option>
<option dtmf="2" value="beef"> roast beef </option>
<option dtmf="3" value="chicken"> frog legs </option>
<filled>
<submit next="/cgi-bin/maincourse.cgi" method="post" namelist="maincourse"/>
</filled>
</field>
|
|
????該例子可能的流程: |
|
C: Please select an entree. Today, we're featuring swordfish; roast beef; frog legs.
H: frog legs.
C: (assigns "chicken" to "maincourse", then submits "maincourse=chicken" to /maincourse.cgi)
|
|
????下面的例子展示了在一個(gè)form的<catch>元素中的<enumerate>元素的正確用法和錯(cuò)誤用法,該form有幾個(gè)<field>元素包含有<option>元素。 |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form>
<block>
We need a few more details to complete your order.
</block>
<field name="color">
<prompt>Which color?</prompt>
<option>red</option>
<option>blue</option>
<option>green</option>
</field>
<field name="size">
<prompt>Which size?</prompt>
<option>small</option>
<option>medium</option>
<option>large</option>
</field>
<field name="quantity">
<grammar type="application/srgs+xml" src="/grammars/number.grxml"/>
<prompt>How many?</prompt>
</field>
<block>
Thank you. Your order is being processed.
<submit next="details.cgi" namelist="color size quantity"/>
</block>
<catch event="help nomatch">
Your options are <enumerate/>.
</catch>
</form>
</vxml>
|
|
????該例子可能的流程: |
|
C: We need a few more details to complete your order. Which color?
H: help. (throws "help" event caught by form-level <catch>)
C: Your options are red, blue, green.
H: red.
C: Which size?
H: H: 7 (throws "nomatch" event caught by form-level <catch>)
C: Your options are small, medium, large.
H: small.
|
|
????在上面的步驟,form級(jí)別的<catch>元素中的<enumerate>元素可以列舉一些內(nèi)容:“color”和“size”<field>中的<option>元素。然而,下一個(gè)<field>就不一樣了: |
|
C: How many?
H: a lot. (throws "nomatch" event caught by form-level <catch>)
|
|
????Form級(jí)別的<catch>元素中使用<enumerate>,導(dǎo)致平臺(tái)拋出error.semantic事件。因?yàn)椤皅uantity”<field>中沒(méi)有包含任何可以列舉的<option>元素。 |
|
????有一種辦法可以解決,就是在“quantity”<field>元素中加一個(gè)field級(jí)別的<catch>元素,如下: |
|
<catch event="help nomatch">
Please say the number of items to be ordered.
</catch
|
|
????這樣,“nomatch”事件被<field>中的<catch>捕獲,下面是一個(gè)可能的流程: |
|
C: Please say the number of items to be ordered.
H: 50.
C: Thank you. Your order is being processed.
|
|
????<enumerate>元素在2.2.4節(jié)中也有詳細(xì)描述。 |
|
????<option>元素的屬性有: |
dtmf |
該<option>元素的DTMF序列,它的作用等同于一個(gè)簡(jiǎn)單的DTMF語(yǔ)法,和應(yīng)用于該序列識(shí)別的DTMF<property>。它和DTMF語(yǔ)法不同的是,它的空格是不起作用的:dtmf=“123#”跟dtmf=“1 2 3 #”的效果是一樣的。 |
accept |
值為exact (默認(rèn))或approximate。當(dāng)其值為exact時(shí),語(yǔ)音識(shí)別時(shí)需完全匹配該元素定義的文本;當(dāng)其值為approximate,語(yǔ)音識(shí)別只需大概匹配該元素定義的文本(詳見(jiàn)2.2.5節(jié))。 |
value |
當(dāng)用戶選擇該<option>時(shí),賦給該<field>元素的form item變量的字符串,無(wú)論用戶是使用語(yǔ)音輸入還是DTMF按鍵輸入。默認(rèn)是使用<option>元素的CDATA內(nèi)容賦值,這些CDATA開(kāi)頭和結(jié)尾的空格都被去掉了。如果<option>沒(méi)有內(nèi)容,就用DTMF序列代替。 |
|
表11:<option>元素的屬性 |
|
????使用<option>元素不排除同時(shí)使用<grammar>元素,結(jié)果將是這兩個(gè)"語(yǔ)法"中的任一個(gè)的匹配。而在同一個(gè)<field>中同時(shí)出現(xiàn)兩個(gè)<grammar>元素則意味著選項(xiàng)的邏輯或,即兩個(gè)語(yǔ)法中只能匹配一個(gè)。 |
? |
二、BLOCK |
|
????<block>是form item,它包含的是可執(zhí)行的內(nèi)容,如果該<block>的form item 變量為undefined,且“cond”屬性(如果有的話)值為true,它就會(huì)被執(zhí)行。 |
|
<block>
Welcome to Flamingo, your source for lawn ornaments.
</block
|
|
????當(dāng)FIA進(jìn)入<block>時(shí),該<block>的form item 變量被自動(dòng)的置為true。因此,每次的form調(diào)用中,<block>一般只被執(zhí)行一次。 |
|
????有時(shí)候,你可以更多地控制<block>。你可以給該form item 變量命名,通過(guò)賦值或清零控制<block>的執(zhí)行。該變量在該form的dialog作用域內(nèi)被聲明。 |
|
????<block>的屬性有: |
name |
該form item變量名,它用來(lái)標(biāo)記該<block>是否符合被執(zhí)行的條件。默認(rèn)為不可訪問(wèn)的內(nèi)部變量。 |
expr |
該form item變量的初始值,默認(rèn)為ECMAScript 的undefined。如果給該form item變量一個(gè)初始值,該form item就不會(huì)被執(zhí)行,除非它的form item變量被清零。 |
cond |
它是一個(gè)boolean表達(dá)式,用來(lái)判定該form item是否可以訪問(wèn)。在會(huì)話之后,它的值必須為true。 |
|
表12:<choice>元素的屬性 |
? |
三、INITIAL |
|
????在一個(gè)典型的混合主動(dòng)式的form中,當(dāng)FIA播放最初的form信息給用戶時(shí),就進(jìn)入了<initial>元素,而不是進(jìn)入計(jì)算機(jī)主導(dǎo)的模式,在計(jì)算機(jī)主導(dǎo)的模式中,每個(gè)field單獨(dú)地被訪問(wèn)。和field item不同的是<initial>沒(méi)有任何語(yǔ)法,也沒(méi)有任何的<filled>操作。例如: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="get_from_and_to_cities">
<grammar src="http://www.directions.example.com/grammars/from_to.grxml"
type="application/srgs+xml"/>
<block>
Welcome to the Driving Directions By Phone.
</block>
<initial name="bypass_init">
<prompt>
Where do you want to drive from and to?
</prompt>
<nomatch count="1">
Please say something like "from Atlanta Georgia to Toledo Ohio".
</nomatch>
<nomatch count="2">
I'm sorry, I still don't understand.
I'll ask you for information one piece at a time.
<assign name="bypass_init" expr="true"/>
<reprompt/>
</nomatch>
</initial>
<field name="from_city">
<grammar src="http://www.directions.example.com/grammars/city.grxml"
type="application/srgs+xml"/>
<prompt>From which city are you leaving?</prompt>
</field>
<field name="to_city">
<grammar src="http://www.directions.example.com/grammars/city.grxml"
type="application/srgs+xml"/>
<prompt>Which city are you going to?</prompt>
</field>
</form>
</vxml>
|
|
????如果在訪問(wèn)<initial>時(shí)拋出一個(gè)事件,則執(zhí)行相應(yīng)的事件處理。和其他的form item一樣,如果<initial>的form item變量為undefined,且它的cond屬性為true,它還是可以再次被訪問(wèn)的。如果用戶的輸入填充了一個(gè)或多個(gè)field item變量,則在任何一個(gè)<filled>操作被執(zhí)行前,所有的<initial>form item變量都被置為true。 |
|
????<initial>form item變量可以顯式地被禁用,或重新被FIA訪問(wèn)。例如,在上面的例子中,<initial>的form item變量在第二個(gè)nomatch事件中被置為true,這樣,F(xiàn)IA就不再處理<initial>元素,而去選定下一個(gè)form item,即一個(gè)<field>,它提示用戶輸入起點(diǎn)城市;同樣的,<initial>元素的form item變量也可以被清零,這樣,F(xiàn)IA就可以再次選定該<initial>元素。 |
|
????在同一個(gè)form中可以有多個(gè)<initial>元素。只有cond屬性為true且在文檔中的順序最靠前的一個(gè)<initial>元素會(huì)被訪問(wèn)。當(dāng)該<initial>元素的form item變量被填充,該form 所有的<initial>元素都被置為true,因此FIA不會(huì)訪問(wèn)其他的<initial>元素。顯式的重置一個(gè)或多個(gè)<initial>元素,可以使它們?cè)俅巫優(yōu)榭捎茫踔猎试SFIA在下一次的循環(huán)中選定另一個(gè)<initial>元素。 |
|
????在FIA的一次循環(huán)中,<initial>元素的cond屬性也可用來(lái)決定哪一個(gè)<initial>元素要被選定。一個(gè)應(yīng)用可提供多個(gè)<initial>元素,但是用cond屬性限定它們只能在特定的環(huán)境下才可用。例如,用cond屬性來(lái)判斷使初級(jí)還是高級(jí)操作模式,且只有在高級(jí)操作模式中使用元素。此外,如果在文檔順序中第一個(gè)<initial>元素的cond屬性被指定了一個(gè)值,該值永遠(yuǎn)都不會(huì)實(shí)現(xiàn),則該<initial>元素也永遠(yuǎn)不會(huì)被執(zhí)行。如果每個(gè)<initial>元素的cond屬性都有一個(gè)使它們不會(huì)被選定的值,則哪一個(gè)<initial>元素都不會(huì)被執(zhí)行。 |
|
????在訪問(wèn)<initial>元素時(shí),一般的語(yǔ)法作用域規(guī)則也會(huì)起作用,詳見(jiàn)3.1.3節(jié)。特別地,作用域?yàn)?lt;field>元素內(nèi)的語(yǔ)法都不會(huì)被激活。 |
|
????注意,顯式的給一個(gè)input item變量賦值,不會(huì)影響到<initial>元素的form item變量的值。 |
|
????<initial>元素的屬性: |
name |
該form item變量的名稱,用于檢測(cè)該<initial>元素是否為可選定的。默認(rèn)為一個(gè)不可訪問(wèn)的內(nèi)部變量。 |
expr |
該form item變量的初始值。默認(rèn)為ECMAScript的undefined。如果賦一個(gè)初始值給它,該form item將不會(huì)被訪問(wèn),除非該form item變量被清零。 |
cond |
ECMAScript表達(dá)式。只有當(dāng)其結(jié)果值為boolean true,該代碼塊才被執(zhí)行,否則不被執(zhí)行。缺省時(shí)為 true。 |
|
表13:<initial>元素的屬性 |
? |
四、SUBDIALOG |
|
????subdialog提供了重用相同的dialog和建立可重用應(yīng)用庫(kù)的一種機(jī)制。 |
|
????在調(diào)用的dialog中的<subdialog>元素通過(guò)它的屬性src或srcexpr調(diào)用了被調(diào)用的dialog(即subdialog)。Subdialog在一個(gè)新的執(zhí)行環(huán)境中執(zhí)行,該執(zhí)行環(huán)境包括了該subdialog中所有的聲明和狀態(tài)信息,它的文檔,應(yīng)用根文檔(如果有的話),計(jì)數(shù)器重置和變量初始化。當(dāng)執(zhí)行了一個(gè)<return>元素或<exit>元素,或再?zèng)]有任何符合條件的form item可供FIA選定時(shí),subdialog返回。<return>元素使控制和數(shù)據(jù)返回到調(diào)用的dialog(見(jiàn)5.3.10節(jié))。當(dāng)subdialog返回時(shí),它的執(zhí)行環(huán)境被刪除,且調(diào)用dialog中的執(zhí)行恢復(fù)。 |
|
????<subdialog>元素所在的dialog和被調(diào)用的dialog的環(huán)境時(shí)互相獨(dú)立的,即使這兩個(gè)dialog是在同一個(gè)文檔中。在被調(diào)用的dialog中是不能訪問(wèn)調(diào)用dialog的作用域鏈中的變量的。在兩個(gè)執(zhí)行環(huán)境中沒(méi)有任何共享的變量實(shí)例。即使調(diào)用dialog和被調(diào)用dialog在同一個(gè)文檔中,它們的執(zhí)行環(huán)境包含的也是不同的變量實(shí)例。當(dāng)調(diào)用dialog和被調(diào)用dialog在不同的文檔中,但它們的根文檔是同一個(gè)時(shí),subdialog中的根變量同樣是不同的變量實(shí)例。當(dāng)subdialog返回時(shí),所有應(yīng)用于subdialog環(huán)境的變量綁定都丟失了。 |
|
????然而,在subdialog的環(huán)境中,一般的語(yǔ)法、事件和變量的作用域規(guī)則也適用。激活的語(yǔ)法包括在該subdialog的文檔和應(yīng)用根文檔中的<link>,<menu>和<form>元素的適當(dāng)?shù)恼Z(yǔ)法,和解釋器環(huán)境定義的默認(rèn)語(yǔ)法。同樣的,事件處理和變量綁定也是根據(jù)標(biāo)準(zhǔn)的作用域?qū)哟芜M(jìn)行的。 |
|
????從編程的角度看,subdialog的工作機(jī)制和子程序的工作機(jī)制是不一樣的,因?yàn)樗恼{(diào)用和被調(diào)用的環(huán)境是相互獨(dú)立的,subdialog不能訪問(wèn)調(diào)用它的dialog中的變量實(shí)例,而子程序取可以訪問(wèn)調(diào)用程序中的變量實(shí)例。類似的,subdialog在語(yǔ)言上不遵循事件滲透模式(event percolation model),而在java語(yǔ)言中,如果在某個(gè)方法中拋出事件,且該被調(diào)用的環(huán)境沒(méi)有處理該事件,則該事件會(huì)自動(dòng)的滲透到調(diào)用的環(huán)境中。在subdialog中拋出的事件交由subdialog中的事件處理取處理。這些事件處理要返回到調(diào)用的環(huán)境中只有通過(guò)顯式的返回該事件。 |
|
????<subdialog>元素的src或srcexpr屬性指定了要調(diào)用的subdialog的URI(見(jiàn)RFC2396)。如果該URI是一個(gè)絕對(duì)或相對(duì)的URI,該URI可以包含一個(gè)查詢串,則獲取該URI并在目標(biāo)文檔中尋找該subdialog。如果<subdialog>元素指定了namelist屬性,則該屬性中的變量被加入到該URI的查詢串中。 |
|
????如果該URI只包含一個(gè)段,且沒(méi)有指定namelist屬性,則不獲取任何URI,并在當(dāng)前文檔中尋找要調(diào)用的subdialog。 |
|
????如果URI中有包含一個(gè)段,則該段指定了要調(diào)用的subdialog,如果沒(méi)有包含段,則以目標(biāo)文檔的第一個(gè)dialog為要調(diào)用的subdialog。 |
|
????如果該URI是非法的(即它指定的diaog或文檔不存在),必須拋出一個(gè)error.badfetch事件。注意,對(duì)于那些在dialog或文檔跳轉(zhuǎn)中出現(xiàn)的錯(cuò)誤,在什么范圍內(nèi)處理是依賴于平臺(tái)的。 |
|
????<subdialog>元素的屬性有: |
name |
存放subdialog返回值的變量,他是一個(gè)ECMAScript Object,該對(duì)象的屬性就是<return>元素的namelist屬性中的變量名。 |
expr |
該form item變量的初始值,它默認(rèn)為ECMAScript的undefined。如果給它賦一個(gè)初始值,則該form item就不會(huì)被訪問(wèn),除非該form item變量被清零。 |
cond |
ECMAScript表達(dá)式。只有當(dāng)其結(jié)果值為boolean true,該元素才被執(zhí)行,否則不被執(zhí)行。缺省時(shí)為true。 |
namelist |
要提交的變量名列表,默認(rèn)是提交0個(gè)變量。如果指定了該屬性,它可以包含多個(gè)變量,以空格隔開(kāi)。在VoiceXML和ECMAScript中聲明的變量都可以被提交。 |
src |
要調(diào)用的subdialog的URI。 |
srcexpr |
ECMAScript表達(dá)式,它的結(jié)果值為要調(diào)用的subdialog的URI。 |
method |
見(jiàn)5.3.8節(jié)。 |
enctype |
見(jiàn)5.3.8節(jié)。 |
fetchaudio |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的fetchaudio的值。 |
fetchhint |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的documentfetchhint的值。 |
fetchtimeout |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的fetchtimeout的值。 |
maxage |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的documentmaxage的值。 |
maxstale |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的documentmaxstale的值。 |
|
表14:<subdialog>元素的屬性 |
|
????必須正確的指定屬性src和srcexpr中的一個(gè),否則,要拋出一個(gè)error.badfetch事件。 |
|
????<subdialog>元素不但可以包含所有form item可包含的元素,還可以包含<param>元素。<subdialog>元素的<param>元素指定了要傳給subdialog的參數(shù),這些參數(shù)必須在subdialog中用<var>元素聲明。試圖用<param>元素給一個(gè)form item變量或未聲明的變量賦值,會(huì)產(chǎn)生一個(gè)語(yǔ)義錯(cuò)誤。當(dāng)subdialog初始化時(shí),它的變量按照文檔順序被依次初始化為<param>元素中相應(yīng)的變量的值。在<param>元素的環(huán)境中,通過(guò)對(duì)它的屬性expr求值來(lái)得到參數(shù)值。在這種情況下,<var>元素的expr屬性被忽略。如果<var>元素聲明的變量沒(méi)有相應(yīng)的<param>元素配對(duì)時(shí),則它的expr屬性值被作為該變量的默認(rèn)值,或者該變量為undefined(如果該<var>元素沒(méi)有指定expr屬性)。 |
|
????在下面的例子中,個(gè)人的生日用于驗(yàn)證他們的駕駛執(zhí)照。<subdialog>元素的src指定了同一個(gè)文檔中的另一個(gè)dialog作為subdialog,<param>元素用于傳遞生日給subdialog: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<!-- form dialog that calls a subdialog -->
<form>
<subdialog name="result" src="#getdriverslicense">
<param name="birthday" expr="'2000-02-10'"/>.
<filled>
<submit next="http://myservice.example.com/cgi-bin/process"/>
</filled>
</subdialog>
</form>
<!-- subdialog to get drivers license -->
<form id="getdriverslicense">
<var name="birthday"/>
<field name="drivelicense">
<grammar src="http://grammarlib/drivegrammar.grxml"
type="application/srgs+xml"/>
<prompt> Please say your drivers license number. </prompt>
<filled>
<if cond="validdrivelicense(drivelicense,birthday)">
<var name="status" expr="true"/>
<else/>
<var name="status" expr="false"/>
</if>
<return namelist="drivelicense status"/>
</filled>
</field>
</form>
</vxml>
|
|
????該例子返回了駕駛執(zhí)照的值和用于表明執(zhí)照是否非法的狀態(tài)變量給調(diào)用的dialog。 |
|
????該例子說(shuō)明了使用<param>元素傳遞數(shù)據(jù)給subdialog的方便性,而不需要使用服務(wù)器端的腳本編程。下面這個(gè)例子使用了服務(wù)器端的腳本編程,它的效果和上面的例子是一樣的: |
|
????調(diào)用一個(gè)subdialog的form的文檔 |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form>
<field name="birthday">
<grammar type="application/srgs+xml" src="/grammars/date.grxml"/>.
What is your birthday?
</filled>
<subdialog name="result" src="/cgi-bin/getlib#getdriverslicense" namelist="birthday">
<filled>
<submit next="http://myservice.example.com/cgi-bin/process"/>
</filled>
</subdialog>
</form>
</vxml>
|
|
????包含subdialog的文檔(由/cgi-bin/getlib產(chǎn)生) |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="getdriverslicense">
<var name="birthday" expr="'1980-02-10'"/>
<!-- Generated by server script -->.
<field name="drivelicense">
<grammar src="http://grammarlib/drivegrammar.grxml"
type="application/srgs+xml"/>
<prompt>
Please say your drivers license number.
</prompt>
<filled>
<if cond="validdrivelicense(drivelicense,birthday)">
<var name="status" expr="true"/>
<else/>
<var name="status" expr="false"/>
</if>
<return namelist="drivelicense status"/>
</filled>
</field>
</form>
</vxml>
|
|
????在上面的例子中,一段服務(wù)器端腳本執(zhí)行后產(chǎn)生了該文檔,并把生日嵌入到代文檔中。 |
|
????下面的例子的作用是使用一個(gè)subdialog收集信用卡信息,該subdialog在一個(gè)單獨(dú)的文檔中。它可在不同的應(yīng)用中重用。它返回了狀態(tài)、信用卡號(hào)和過(guò)期時(shí)間。如果得不到結(jié)果,返回狀態(tài)值為“no_result”: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<!-- Example of subdialog to collect credit card information. -->
<!-- file is at http://www.somedomain.example.com/ccn.vxml -->
<form id="getcredit">
<var name="status" expr="'no_result'"/>
<field name="creditcardnum">
<prompt>What is your credit card number?</prompt>.
<help>.
I am trying to collect your credit card information.
<reprompt/>
</help>
<nomatch>
<return namelist="status"/>
</nomatch>
<grammar src="ccn.grxml" type="application/srgs+xml"/>
</field>
<field name="expirydate">
<grammar type="application/srgs+xml" src="/grammars/date.grxml"/>
<prompt>What is the expiry date of this card?</prompt>
<help>
I am trying to collect the expiry date of the credit card number you provided.
<reprompt/>
</help>
<nomatch>
<return namelist="status"/>
</nomatch>
</field>
<block>
<assign name="status" expr="'result'"/>
<return namelist="status creditcardnum expirydate"/>
</block>
</form>
</vxml>
|
|
????下面是一個(gè)應(yīng)用,它包含有一個(gè)調(diào)用dialog。該應(yīng)用通過(guò)混合主動(dòng)式dialog獲得軟件名和操作系統(tǒng)名,然戶調(diào)用subdialog要求用戶輸入信用卡信息: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<!-- Example main program -->
<!-- http://www.somedomain.example.com/main.vxml -->
<!-- calls subdialog ccn.vxml -->
<!-- assume this gets defined by some dialog -->
<var name="username"/>
<form id="buysoftware">
<var name="ccn"/>
<var name="exp"/>
<grammar src="buysoftware.grxml" type="application/srgs+xml"/>.
<initial name="start">.
<prompt>
Please tell us the software product you wish to buy
and the operating system on which it must run.
</prompt>
<noinput>
<assign name="start" expr="true"/>
</noinput>
</initial>
<field name="product">
<prompt>Which software product would you like to buy?</prompt>
</field>
<field name="operatingsystem">
<prompt>Which operating system does this software need to run on?</prompt>
</field>
<subdialog name="cc_results" src="http://somedomain.example.com/ccn.vxml">
<filled>
<if cond="cc_results.status=='no_result'">
Sorry, your credit card information could not be
Obtained. This order is cancelled.
<exit/>
<else/>
<assign name="ccn" expr="cc_results.creditcardnum"/>
<assign name="exp" expr="cc_results.expirydate"/>
</if>
</filled>
</subdialog>
<block>
We will now process your order. Please hold.
<submit next="www.somedomain.example.com/process_order.asp"
namelist="username product operatingsystem ccn exp"/>
</block>
</form>
</vxml>
|
? |
五、OBJECT |
|
????在VoiceXML應(yīng)用程序中通過(guò)<object>元素,VoiceXML的執(zhí)行平臺(tái)可以擴(kuò)展依賴于平臺(tái)的一些功能。在初始化和執(zhí)行期間,<object>元素直接使用他自己的內(nèi)容(例如它的<param>子元素)。因此,不能認(rèn)為<object>元素的內(nèi)容是可有可無(wú)的。注意,和其他的field item一樣,<object>元素也有<prompt>元素和<catch>元素,它也可以有<filled>操作。 |
|
????例如,能像上面的例子一樣訪問(wèn)一個(gè)依賴于平臺(tái)的用來(lái)收集信用卡信息的object。 |
|
<object name="debit" classid="method://credit_card/gather_and_debit"
data="http://www.recordings.example.com/prompts/credit/jesse.jar">
<param name="amount" expr="document.amt"/>
<param name="vendor" expr="vendor_num"/>
</object>
|
|
????在這個(gè)例子中,當(dāng)object被調(diào)用時(shí),<param>元素用于傳遞參數(shù)。<object>元素執(zhí)行后返回一個(gè)ECMAScript Object作為該fom item變量的值。下面的例子中的<block>元素引用了object返回的值。 |
|
<block>
<prompt>
The card type is <value expr="debit.card"/>.
</prompt>
<prompt>
The card number is <value expr="debit.card_no"/>.
</prompt>
<prompt>
The expiration date is <value expr="debit.expiry_date"/>.
</prompt>
<prompt>
The approval code is <value expr="debit.approval_code"/>.
</prompt>
<prompt>
The confirmation number is <value expr="debit.conf_no"/>.
</prompt>
</block>
|
|
????在下面這個(gè)例子中,假設(shè)平臺(tái)有一個(gè)object,該object可以讓用戶通過(guò)電話鍵盤輸入任意的文本信息。 |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="gather_pager_message">
<object name="message" classid="builtin://keypad_text_input">
<prompt>
Enter your message by pressing your keypad once
per letter. For a space, enter star. To end the
message, press the pound sign.
</prompt>
</object>
<block>
<assign name="document.pager_message" expr="message.text"/>
<goto next="#confirm_pager_message"/>
</block>
</form>
</vxml>
|
|
????用戶首先聽(tīng)到一些提示語(yǔ),然后按鍵輸入信息。在<block>元素中把用戶輸入的信息賦給變量document.pager_message。 |
|
????<object>元素的屬性: |
name |
當(dāng)該<object>元素執(zhí)行時(shí),該form item變量被置為一個(gè)ECMAScript object類型的值。 |
expr |
該form item變量的初始值,默認(rèn)為ECMAScript的undefined。如果它的值不為ECMAScript的undefined,則它將不會(huì)被訪問(wèn),除非該form item變量被清零。 |
cond |
ECMAScript 表達(dá)式。只有當(dāng)其結(jié)果值為boolean true,該form item塊才被執(zhí)行,否則不被訪問(wèn)。缺省時(shí)為true。 |
classid |
一個(gè)URI,它指定了要執(zhí)行的object的位置。該URI的拼寫(xiě)規(guī)則是依賴于平臺(tái)的。 |
codebase |
基路徑,用于解析classid、data和archive屬性指定的相對(duì)URI。它默認(rèn)為當(dāng)前文檔的基礎(chǔ)URI。 |
codetype |
下載classid指定的object時(shí)期望的數(shù)據(jù)類型。如果沒(méi)有指定,默認(rèn)為屬性type的值。 |
data |
指定object數(shù)據(jù)的位置的URI。如果它是一個(gè)相對(duì)的URI,則以codebase屬性指定的值為基路徑。 |
type |
Data屬性指定的數(shù)據(jù)的類型。 |
archive |
一組和該object有關(guān)的檔案的URI,由空格隔開(kāi)。這些檔案包含了classid和data屬性指定的數(shù)據(jù)。如果這些URI是一個(gè)相對(duì)的URI,則以codebase屬性指定的值為基路徑。 |
fetchhint |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的documentfetchhint的值。 |
fetchtimeout |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的fetchtimeout的值。 |
maxage |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的documentmaxage的值。 |
maxstale |
見(jiàn)6.1節(jié)。它默認(rèn)為<property>的documentmaxstale的值。 |
|
表15:<object>元素的屬性 |
|
????沒(méi)有必要提供依賴于平臺(tái)的object,如果基于特定平臺(tái)的object不支持,將拋出error.unsupported.objectname事件。如果做到了這一點(diǎn),就可以認(rèn)為是支持<object>元素了。 |
|
????Object自己負(fù)責(zé)檢查它收到的參數(shù)名或參數(shù)值是否非法。如果是非法的話,<object>元素拋出一個(gè)錯(cuò)誤。該錯(cuò)誤可以是依賴于object的,也可以是5.2.6節(jié)中列出的標(biāo)準(zhǔn)錯(cuò)誤之一。 |
? |
六、RECORD |
|
????<record>元素是一個(gè)input item,用于收集用戶的錄音。該input item變量保存了錄制的音頻的引用。它能被播放(使用<audio>元素的expr屬性)或者提交給服務(wù)器,如下面的例子: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form>
<property name="bargein" value="true"/>
<block>
<prompt>
Riley is not available to take your call.
</prompt>
</block>
<record name="msg" beep="true" maxtime="10s" finalsilence="4000m
dtmfterm="true" type="audio/x-wav">
<prompt timeout="5s">
Record a message after the beep.
</prompt>
<noinput>
I didn't hear anything, please try again.
</noinput>
</record>
<field name="confirm">
<grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
<prompt>
Your message is <audio expr="msg"/>.
</prompt>
<prompt>
To keep it, say yes. To discard it, say no.
</prompt>
<filled>
<if cond="confirm">
<submit next="save_message.pl" enctype="multipart/form-data"
method="post" namelist="msg"/>
</if>
<clear/>
</filled>
</field>
</form>
</vxml>
|
|
????它先給用戶播放<record>元素的提示語(yǔ),然后進(jìn)行錄音。如果遇到如下的情況之一,就會(huì)終止錄音:達(dá)到final silence的條件,或者有DTMF按鍵輸入,或者達(dá)到最大的錄音時(shí)間,或者用戶掛機(jī)。該錄音被回放,如果用戶滿意,就用HTTP POST方法把它提交給服務(wù)器存儲(chǔ)。注意:和其他的input item一樣,<record>元素也有<grammar>、<prompt>和<catch>元素。它也可以有<filled>操作。 |
|
|
圖7: 提示語(yǔ)、音頻錄制和DTMF輸入的時(shí)間選擇 |
|
????當(dāng)用戶在錄音時(shí)掛機(jī),錄音終止并拋出connection.disconnect.hangup事件。然而,在用戶掛機(jī)之前所錄下來(lái)的音頻還是可用的,可通過(guò)<record>元素的form item變量引用。即使,在掛機(jī)之后,應(yīng)用程序,例如下面這個(gè)簡(jiǎn)單的語(yǔ)音郵件服務(wù),還是能把該音頻數(shù)據(jù)返回給服務(wù)器: |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form>
<record name="msg" beep="true" maxtime="10s" finalsilence="4000ms"
dtmfterm="true" type="audio/x-wav">
<prompt timeout="5s">
Record a message after the beep.
</prompt>
<noinput>
I didn't hear anything, please try again.
</noinput>
<catch event="connection.disconnect.hangup">
<submit next="./voicemail_server.asp"/>
</catch>
</record>
</form>
</vxml>
|
|
????在播放完所有的提示語(yǔ)之后(如果有定義“beep”聲的話,也包括“beep”聲),錄音開(kāi)始。作為一種優(yōu)化,平臺(tái)可以在用戶開(kāi)始說(shuō)話的同時(shí)開(kāi)始錄音。 |
|
????Timeout時(shí)間間隔在開(kāi)始播放提示語(yǔ)時(shí)即生效,它的持續(xù)時(shí)間由timeout property決定。如果在開(kāi)始錄音之前就已經(jīng)超過(guò)了timeout的時(shí)間間隔,則拋出noinput事件。 |
|
????Maxtime時(shí)間間隔在開(kāi)始錄音時(shí)生效,它的持續(xù)時(shí)間取決于該form item的maxtime屬性。如果在錄音結(jié)束之前就超過(guò)maxtime時(shí)間間隔,則錄音終止,且該form item的maxtime影子變量被置為true。 |
|
????當(dāng)拋出一個(gè)事件,或者有DTMF(語(yǔ)音)輸入匹配了一個(gè)激活的語(yǔ)法,或者超過(guò)了maxtime時(shí)間間隔,錄音終止。最為一個(gè)最佳的選擇,平臺(tái)可以在達(dá)到一個(gè)靜音的時(shí)間間隔(由finalsilence屬性設(shè)置)后終止錄音,該靜音的時(shí)間間隔表示用戶已經(jīng)停止輸入了。 |
|
????如果在執(zhí)行<record>元素時(shí),沒(méi)有收集到任何音頻,則該form item變量保持unfilled。例如,當(dāng)在播放提示語(yǔ)的時(shí)候接收到DTMF或語(yǔ)音輸入,或達(dá)到timeout時(shí)間間隔(如果在播放提示語(yǔ)的時(shí)候,開(kāi)發(fā)者想要一個(gè)輸入來(lái)初始化錄音,則<prompt>元素應(yīng)緊接著放在<field>元素之后,且該<prompt>元素的timeout屬性值為0),就會(huì)出現(xiàn)這種情況。 |
|
????<record>元素包含了dtmfterm屬性,當(dāng)它的值為true時(shí),它的作用等同于定義了一個(gè)本地的DTMF語(yǔ)法,該語(yǔ)法匹配了所有的DTMF輸入。 |
|
????任何DTMF按鍵匹配了一個(gè)激活的語(yǔ)法就會(huì)終止錄音。DTMF按鍵沒(méi)有匹配一個(gè)激活的語(yǔ)法就會(huì)被忽略(因此不會(huì)終止錄音,也就是不會(huì)影響到錄音)且它的信號(hào)可以被平臺(tái)清除掉(可選的)。 |
|
????平臺(tái)在錄音的時(shí)候支持語(yǔ)音語(yǔ)法,這是可選的。如果平臺(tái)在錄音的同時(shí)支持語(yǔ)音識(shí)別,則錄音會(huì)被匹配一個(gè)激活的語(yǔ)音語(yǔ)法的語(yǔ)音輸入終止。終止錄音的語(yǔ)音輸入可通過(guò)application.lastresult$和該item的utterance和confidence影子變量訪問(wèn)。用于識(shí)別終止錄音的語(yǔ)音輸入的音頻是不可用的,且它不是錄音的一部分。 |
|
????如果終止錄音時(shí)匹配的語(yǔ)法(DTMF或語(yǔ)音)是一個(gè)本地語(yǔ)法,該錄音存放在該form item變量中,否則該form item變量為unfilled且返回到FIA。無(wú)論是哪一種情況,application.lastresult$和該form item的影子變量都會(huì)被賦值。 |
|
????注意:在這種情況下雖然該form item變量沒(méi)有被錄音所填充,然而匹配一個(gè)非本地的語(yǔ)法可以導(dǎo)致給該form item變量賦某種值(詳見(jiàn)3.1.6節(jié))。 |
|
????<record>元素的屬性有: |
name |
該input item變量保存了所錄制的音頻。注意,各個(gè)平臺(tái)實(shí)現(xiàn)該變量的方式可以是不同的(雖然該技術(shù)說(shuō)明書(shū)中要求所有的平臺(tái)都必須在<audio>元素和<submit>元素中支持該變量的行為)值。 |
expr |
該form item變量的初始值,它默認(rèn)為ECMAScript的undefined 。如果給它賦一個(gè)初始值,則該form item就不會(huì)被訪問(wèn),除非該form item變量被清零。 |
cond |
ECMAScript表達(dá)式。只有當(dāng)其結(jié)果值為boolean true,該元素才被執(zhí)行,否則不被執(zhí)行。缺省時(shí)為 true。 |
modal |
如果該屬性值為true(默認(rèn)值),在錄音時(shí),所有非本地的語(yǔ)音和DTMF語(yǔ)法都會(huì)失效。若為false,則是激活的。 |
beep |
當(dāng)為true時(shí),錄音前有“嘟”音提示。缺省值為 false。 |
maxtime |
最長(zhǎng)錄音時(shí)間。它是一個(gè)Time Designation (見(jiàn)6.5節(jié))。默認(rèn)為一個(gè)依賴于平臺(tái)的值。 |
finalsilence |
表示錄音結(jié)束的靜音輸入時(shí)間。它是一個(gè)Time Designation (見(jiàn)6.5節(jié))。默認(rèn)為一個(gè)依賴于平臺(tái)的值。 |
dtmfterm |
如果該屬性值為true,任何沒(méi)有匹配一個(gè)激活語(yǔ)法的DTMF按鍵被認(rèn)為匹配了一個(gè)激活的(anonymous)本地DTMF語(yǔ)法。默認(rèn)值為true。 |
type |
表示所錄制的音頻的媒體格式。平臺(tái)必須支持附錄E中指定的聲音文件格式(也可以支持其他的格式)。默認(rèn)為一個(gè)平臺(tái)指定的格式,該格式應(yīng)該是不許支持的格式之一。 |
|
表16:<record>元素的屬性 |
|
????在錄音之后,<record>元素的影子變量也被賦值: |
|
????下表是<field>元素的影子變量(shadow variables),該<field>的form item 變量名為name。影子變量utterance、 inputmode 和 interpretation的值必須和application.lastresult$ (詳見(jiàn)5.1.5節(jié))中相應(yīng)變量的值一樣。 |
name$.duration |
錄音的持續(xù)時(shí)間,單位為毫秒。 |
name$.size |
錄音的大小,單位為byte。 |
name$.termchar |
如果該form item的dtmfterm屬性值為true,且用戶通過(guò)DTMF按鍵終止錄音,則該影子變量的值為用戶的按鍵(例如“#”),否則它的值為undefined。 |
name$.maxtime |
如果是因?yàn)檫_(dá)到最大錄音時(shí)間而終止錄音,則該變量值為true,否則為false。 |
name$.utterance |
如果是因?yàn)橛脩粼阡浺魰r(shí)的語(yǔ)音輸入匹配了一個(gè)語(yǔ)法而終止了錄音,則該變量值為被匹配的字符串,否則它的值為undefined。 |
name$.confidence |
當(dāng)用戶在錄音時(shí)的語(yǔ)音輸入匹配了一個(gè)語(yǔ)法而終止了錄音,該變量值為被匹配的字符串的confidence級(jí)別(0.0-1.0)否則值為undefined。 |
|
表17:<record>元素的影子變量 |
? |
七、TRANSFER |
|
????<transfer>元素引導(dǎo)VoiceXML解釋器將主叫方連接到諸如電話、或其它語(yǔ)音應(yīng)用程序。在轉(zhuǎn)接過(guò)程中,當(dāng)前的解釋器進(jìn)程處于等待狀態(tài)。 |
|
????有各種轉(zhuǎn)接方式,如:“bridge”、“blind”。還有基于網(wǎng)絡(luò)的轉(zhuǎn)接,如“switchhook transfer”。在VoiceXML解釋器中,只支持Bridge和Blind兩種方式的轉(zhuǎn)接類型。其它的依賴于指定的平臺(tái)和網(wǎng)絡(luò)特性,以及配置,這些內(nèi)容超出了本規(guī)范的范圍。 |
|
????<Transfer>元素是可選的。支持<Transfer>的平臺(tái)應(yīng)支持Bridge和Blind兩種Transfer類型。支持Bridge transfer的平臺(tái)在轉(zhuǎn)接通話過(guò)程中,對(duì)DTMF接收和語(yǔ)音識(shí)別的支持是可選的。 |
|
????<Transfer>元素的屬性: |
name |
在bridge方式下,保存轉(zhuǎn)接通話完成后的結(jié)果值。在blind方式下,這個(gè)變量的值是undefined。 |
expr |
Form item的初始值。缺省是ECMAScript undefined。如果初始化到一個(gè)值,這個(gè)元素將不被訪問(wèn)。只有當(dāng)這個(gè)Item的值被清除后才能被訪問(wèn)。 |
cond |
這是一個(gè)表達(dá)式,只有當(dāng)它是true時(shí),這個(gè)才form item可以被訪問(wèn)。 |
dest |
目標(biāo)的URI地址(如:電話、IP電話地址)。VoiceXML平臺(tái)必須支持tel:URL語(yǔ)法格式(這種語(yǔ)法格式在[RFC2806]中描述),也可以支持其它基于URI地址格式。 |
destexpr |
ECMAScript表達(dá)式,它生成URI地址。 |
bridge |
決定平臺(tái)在<transfer>執(zhí)行后,是否依然監(jiān)控主叫方和被叫方。
true | Bridge transfer:VoiceXML解釋器一直處于等待狀態(tài),直到Transfer從轉(zhuǎn)接通話狀態(tài)下退出。如果因?yàn)閽鞕C(jī)或網(wǎng)絡(luò)的原因而線路中斷,會(huì)拋出一個(gè)Connection.disconnect.hangup事件。如果通話因?yàn)槠渌蚨袛啵袛嘣驎?huì)寫(xiě)在元素的屬性里。 | false | Blind transfer(default):VoiceXML解釋器在完成轉(zhuǎn)接后,不再監(jiān)控轉(zhuǎn)接過(guò)程,也不再在元素的名字屬性中報(bào)告掛斷結(jié)果,而是立即拋出一個(gè)connection.disconnect.transfer事件。 |
|
connectiontimeout |
在電話轉(zhuǎn)接過(guò)程中,VoiceXML解釋器在noanswer事件出現(xiàn)前能夠等待的時(shí)間。這一屬性只有在bridge是true時(shí)才有效。在缺省情況下,這個(gè)值是平臺(tái)指定的。 |
maxtime |
允許通話的最大時(shí)間。0表示沒(méi)有時(shí)間限制。只有當(dāng)bridge是true時(shí)才有效。缺省情況下,這個(gè)值是0。 |
transferaudio |
在轉(zhuǎn)接而對(duì)方?jīng)]有應(yīng)答前,用來(lái)放音的語(yǔ)音URI地址。如果語(yǔ)音沒(méi)有取到,錯(cuò)誤將被忽略,轉(zhuǎn)接繼續(xù)進(jìn)行。 |
aai |
應(yīng)用程序之間用來(lái)交換的串信息。它可以在進(jìn)程變量session.connection.aai中得到。aai數(shù)據(jù)的傳輸依賴于網(wǎng)關(guān)或ISDN、SIP。數(shù)據(jù)發(fā)送到遠(yuǎn)端是否成功,并沒(méi)有報(bào)告。雖然所有的平臺(tái)必須支持aai屬性,平臺(tái)不一定非要發(fā)送aai和接收aai數(shù)據(jù)。如果平臺(tái)不能接收aai數(shù)據(jù),必須將session.connection.aai變量置為ECMAScript undefined。 |
destexpr |
ECMAScript表達(dá)式,它生成URI地址。 |
|
表18:<transfer>元素的屬性 |
|
????“dest”和“destexpr”必須指定其一。如果兩者都沒(méi)有指定,error.badfetch事件就會(huì)拋出。“aai”和“aai”事件也必須指定其一,不然,error.badfetch事件也產(chǎn)生。 |
? |
????<一>、Blind Transfer |
|
????Blind Transfer是用來(lái)將主、被叫聯(lián)結(jié)起來(lái)的操作。在元素<transfer>前和在元素<transfer>內(nèi)的<prompt>語(yǔ)句都會(huì)在轉(zhuǎn)接開(kāi)始前依次播放,而且同樣具有bargein屬性。 |
|
|
圖8: 在Blind Transfer下的聯(lián)結(jié): <transfer bridge="false"> |
|
????因?yàn)樵谵D(zhuǎn)接過(guò)程中聲音文件不能播放給主叫,所以transferaudio屬性指定的語(yǔ)音文件在轉(zhuǎn)接過(guò)程中被忽略。不管轉(zhuǎn)接是否成功,VoiceXML語(yǔ)音平臺(tái)不能再獲得對(duì)呼入和轉(zhuǎn)接電話的控制權(quán)。 |
|
????轉(zhuǎn)接的狀態(tài)不能得到。例如,不可能知道被叫是不是忙,這次呼叫是否成功等等。然而,有些錯(cuò)誤是可以得到的,如主叫無(wú)權(quán)呼叫被叫方或者目標(biāo)地址URI是錯(cuò)誤的。 |
|
????一旦轉(zhuǎn)接開(kāi)始,VoiceXML解釋器與電話進(jìn)程脫離聯(lián)系,平臺(tái)將拋出一個(gè)connection.disconnect.transfer錯(cuò)誤,解釋器還會(huì)繼續(xù)運(yùn)行。 |
Action |
Form item變量的值 |
事件或錯(cuò)誤 |
原因 |
轉(zhuǎn)接開(kāi)始 |
undefined |
connection.disconnect.transfer |
轉(zhuǎn)接進(jìn)行,但不會(huì)返回。 |
轉(zhuǎn)接結(jié)束 |
unknown |
? |
轉(zhuǎn)接結(jié)束,但結(jié)果未知。 |
|
表19:Blind Transfer Outcomes |
? |
????<二>、Bridge Transfer |
|
????對(duì)于Bridge Transfer,主叫和被叫是以全雙工方式進(jìn)行的。 |
|
|
圖9: bridge transfer下的電話轉(zhuǎn)接:<transfer bridge="true"> |
|
????在<transfer>語(yǔ)句前和在<transfer>語(yǔ)句內(nèi)的提示語(yǔ)音會(huì)依次播放,bargein也是有效的。 |
? |
??????1、Listening for user input during a transfer |
|
??????在<transfer>元素中可以指定一個(gè)或多個(gè)語(yǔ)法,這樣在通話過(guò)程中,就可以監(jiān)視用戶的輸入而中斷轉(zhuǎn)接。 |
|
??????可以指定兩種輸入: |
|
????????·DTMF輸入; |
|
????????·語(yǔ)音輸入。 |
|
??????如果用戶的輸入匹配了所指定的語(yǔ)法,VoiceXML解釋器將繼續(xù)按照VoiceXML文本所指定的操作運(yùn)行。如果沒(méi)有指定語(yǔ)法文件,在轉(zhuǎn)接過(guò)程中,將不監(jiān)控用戶的輸入。Bargein屬性同樣適用于元素<transfer>前和元素<transfer>內(nèi)的語(yǔ)音提示。此時(shí),外呼開(kāi)始;Transferaudio所指定的語(yǔ)音播放開(kāi)始;語(yǔ)法文件所指定的DTMF或語(yǔ)音識(shí)別成為Bargein的唯一方式(直到對(duì)遠(yuǎn)端的聯(lián)結(jié)建立)。因此bargeintype被忽略。轉(zhuǎn)接元素是模式的,因?yàn)樵谄渥饔糜蛑獾恼Z(yǔ)法沒(méi)有激活。 |
|
??????平臺(tái)解釋器沒(méi)有監(jiān)控被叫的輸入。 |
? |
??????2、Handling caller, callee, or network disconnections |
|
??????當(dāng)試圖去聯(lián)結(jié)被叫,平臺(tái)監(jiān)控呼叫進(jìn)程指示器(in bound或out of bound,依賴于特殊的聯(lián)結(jié)類型和協(xié)議)。在成功的轉(zhuǎn)接期間,平臺(tái)監(jiān)控(out of band)電話事件,如電話的掛機(jī)事件。 |
|
??????如果被叫掛斷,主叫重新繼續(xù)它的任務(wù)。如果主叫掛斷,平臺(tái)掛斷被叫。主叫或被叫掛斷或兩者同時(shí)掛斷都不影響平臺(tái)解釋器的運(yùn)行。 |
|
??????在轉(zhuǎn)接到被叫前,可能的結(jié)果如下: |
Action |
Form item變量的值 |
事件或錯(cuò)誤 |
原因 |
主叫掛斷 |
? |
connection.disconnect.hangup |
主叫掛機(jī)。 |
被叫忙 |
busy |
? |
被叫忙。 |
網(wǎng)絡(luò)忙 |
Network_busy |
? |
中間網(wǎng)絡(luò)不應(yīng)答。 |
被叫沒(méi)有應(yīng)答 |
noanswer |
? |
在connecttimeout屬性指定的時(shí)間內(nèi)沒(méi)有應(yīng)答。 |
---- |
unknown |
? |
轉(zhuǎn)接結(jié)束但結(jié)果未知。 |
|
表20:Bridged Transfer Outcomes Prior to Connection Being Established |
|
??????轉(zhuǎn)接后可能的結(jié)果: |
Action |
Form item變量的值 |
事件或錯(cuò)誤 |
原因 |
主叫掛斷 |
? |
connection.disconnect.hangup |
主叫掛斷。 |
主叫掛斷 |
near_end_disconnect |
? |
主叫通過(guò)DTMF或語(yǔ)音強(qiáng)迫被叫掛機(jī)。 |
平臺(tái)掛斷被叫 |
maxtime_disconnect |
? |
因?yàn)樽畲蟮耐ㄔ挄r(shí)間到達(dá),平臺(tái)掛斷被叫。 |
網(wǎng)絡(luò)掛斷 |
network_disconnect |
? |
網(wǎng)絡(luò)掛斷被叫。 |
被叫掛斷 |
far_end_disconnect |
? |
被叫掛斷。 |
---- |
unknown |
? |
轉(zhuǎn)接因未知原因而中斷。 |
|
表21:Bridged Transfer Outcomes After Connection Established |
|
??????在轉(zhuǎn)接完成后,元素<transfer>的影子變量有如下ECAMScript屬性: |
name$.duration |
轉(zhuǎn)接通話時(shí)間(浮點(diǎn)值),如果在被叫回答前就被掛斷,此值為零。 |
name$.inputmode |
中斷轉(zhuǎn)接過(guò)程的輸入模式(voice或dtmf)。 |
name$.utterance |
如果轉(zhuǎn)接因語(yǔ)音而中斷,此值中應(yīng)是說(shuō)出的文本;否則沒(méi)有定義。 |
|
表22:<transfer>元素的影子變量 |
? |
??????3、Audio during bridge transfer attempt |
|
??????在Bridge transfer過(guò)程中,也許要對(duì)主叫播放語(yǔ)音。例如一個(gè)廣告(“Buy Joe's Spicy Shrimp Sauce”)或一個(gè)信息(“Your call is very important to us; please wait while we connect you to the next available agent.”)。這樣便可以對(duì)呼叫進(jìn)程中振鈴、忙等情況而出現(xiàn)的靜音起一個(gè)補(bǔ)償作用。 |
|
??????當(dāng)遠(yuǎn)端的應(yīng)答出現(xiàn)時(shí),Transferaudio的播放中止。遠(yuǎn)端的應(yīng)答不會(huì)永遠(yuǎn)出現(xiàn)的,因?yàn)檫h(yuǎn)端交換機(jī)可以播放語(yǔ)音而不回答呼叫(這些語(yǔ)音包括一個(gè)特殊的音調(diào)、忙音、網(wǎng)絡(luò)忙音、或者一個(gè)提示聯(lián)結(jié)不能進(jìn)行的錄音)。 |
|
??????如果一個(gè)語(yǔ)音播放的時(shí)間短于轉(zhuǎn)接到遠(yuǎn)端的所需的時(shí)間,主叫也許會(huì)聽(tīng)到靜音、平臺(tái)所指定的語(yǔ)音、或者是呼叫進(jìn)行過(guò)程中的信息。具體是何種語(yǔ)音依賴于不同的平臺(tái)。 |
? |
????<三>、Transfer Errors and Events |
|
事件 |
原因 |
轉(zhuǎn)接類型 |
connection.disconnect.hangup |
主叫掛機(jī)。 |
bridge |
connection.disconnect.transfer |
將主叫轉(zhuǎn)接到另一方,而且返回。 |
blind |
|
表23:Events Thrown During Transfer |
|
????如果transfer不能進(jìn)行,下列錯(cuò)誤將會(huì)拋出: |
錯(cuò)誤 |
原因 |
轉(zhuǎn)接類型 |
error.connection.noauthorization |
主叫不允許呼叫目標(biāo)。 |
Blind和Bridge |
error.connection.baddestination |
目標(biāo)URI錯(cuò)誤。 |
Blind和Bridge |
error.connection.noroute |
平臺(tái)不能對(duì)目標(biāo)呼叫 |
bridge |
error.connection.noresource |
平臺(tái)不能分配資源而不能呼叫。 |
bridge |
error.connection.protocol.nnn |
協(xié)議棧在聯(lián)結(jié)中出現(xiàn)一個(gè)例外,此例外不能對(duì)應(yīng)于任何一個(gè)error.connection事件。 |
bridge |
error.unsupported.transfer.blind |
平臺(tái)不能支持Blind轉(zhuǎn)接。 |
blind |
error.unsupported.transfer.bridge |
平臺(tái)不能支持Bridge轉(zhuǎn)接。 |
bridge |
error.unsupported.uri |
平臺(tái)不能支持用到的URI格式,指定的變量_message(Section 5.2.2)將包含串“The URI x is not a supported URI format”,x是<transfer>的dest或destexpr屬性。 |
Blind和Bridge |
|
表24:Transfer Attempt Error Events |
? |
????<四>、Example |
|
????下面的例子試圖將主叫轉(zhuǎn)接到另一方,并等待通話的結(jié)束。語(yǔ)音提示可能在元素<transfer>前或內(nèi)部。這也許用來(lái)通知主叫,發(fā)生了什么事情。這種通知通常是“請(qǐng)等待,正在轉(zhuǎn)接呼叫”。在<block>、<transfer>中的<prompt>元素,在執(zhí)行轉(zhuǎn)接前,依次播放。語(yǔ)音隊(duì)列開(kāi)始播放,呼叫便開(kāi)始。在缺省情況下,主叫聯(lián)結(jié)到外呼的電話通道。“transferaudio”屬性指定對(duì)主叫播放的語(yǔ)音文件,它會(huì)在遠(yuǎn)端應(yīng)答時(shí)停止播放。如果語(yǔ)音的長(zhǎng)度大于聯(lián)結(jié)所需的時(shí)間,只要遠(yuǎn)端應(yīng)答,也會(huì)停止播放。 |
|
|
圖10:Sequence and timing during an example of a bridge transfer |
|
<?xml version="1.0" encoding="UTF-8"?>
<vxml version="2.0" 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">
<form id="xfer">
<var name="mydur" expr="0"/>
<block>
<!-- queued and played before starting the transfer -->
<prompt>
Calling Riley. Please wait.
</prompt>
</block>
<!-- Play music while attempting to connect to far-end -->
<!-- "hotword" bargeintype during transferaudio only -->
<!-- Wait up to 60 seconds for the far end to answer -->
<transfer name="mycall" dest="tel:+1-555-123-4567"
transferaudio="music.wav" connecttimeout="60s" bridge="true">
<submit next="./voicemail_server.asp"/>
<!-- queued and played before starting the transfer -->
<!-- bargein properties apply during this prompt -->
<prompt>
Say cancel to disconnect this call at any time.
</prompt>
<!-- specify an external grammar to listen for "cancel" command -->
<grammar src="cancel.grxml" type="application/srgs+xml"/>
<filled>
<assign name="mydur" expr="mycall$.duration"/>
<if cond="mycall == 'busy'">
<prompt>
Riley's line is busy. Please call again later.
</prompt>
<elseif cond="mycall == 'noanswer'"/>
<prompt>
Riley can't answer the phone now. Please call again later.
</prompt>
</if>
</filled>
</transfer>
<!-- submit call statistics to server -->
<block>
<submit namelist="mycall mydur" next="/cgi-bin/report"/>
</block>
</form>
</vxml>
|
?
第四節(jié) Filled | ? | ? | ????<filled>元素指定了當(dāng)一個(gè)或多個(gè)input item被填充后要執(zhí)行的操作。它可以出現(xiàn)在兩個(gè)地方:作為<form>元素的子元素,或者作為input item的子元素。 | | ????如果作為<form>元素的子元素,當(dāng)一個(gè)或多個(gè)input item的組合被填充后,<filled>元素用于執(zhí)行一些操作。下面的例子中的<filled>元素用于交叉檢查以確保“start_city” <field>和“end_city”<field>的識(shí)別結(jié)果不一樣: | | <?xml version="1.0" encoding="UTF-8"?> <vxml version="2.0" 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"> <form id="get_starting_and_ending_cities"> <field name="start_city"> <grammar src="http://www.grammars.example.com/voicexml/city.grxml" type="application/srgs+xml"/> <prompt>What is the starting city?</prompt> </field> <field name="end_city"> <grammar src="http://www.grammars.example.com/voicexml/city.grxml" type="application/srgs+xml"/> <prompt>What is the ending city?</prompt> </field> <filled mode="all" namelist="start_city end_city"> <if cond="start_city == end_city"> <prompt>You can't fly from and to the same city.</prompt> <clear/> </if> </filled> </form> </vxml> | | ????如果<filled>作為一個(gè)input item的子元素出現(xiàn),它指定了當(dāng)該input item被填充后要執(zhí)行的操作: | | <?xml version="1.0" encoding="UTF-8"?> <vxml version="2.0" 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"> <form id="get_city"> <field name="city"> <grammar type="application/srgs+xml" src="http://www.ship-it.example.com/grammars/served_cities.grxml"/> <prompt>What is the city?</prompt> <filled> <if cond="city == 'Novosibirsk'"> <prompt>Note, Novosibirsk service ends next year.</prompt> </if> </filled> </field> </form> </vxml> | | ????每次收集用戶的輸入后,該輸入中提及的input item都被做了標(biāo)記,然后解釋器根據(jù)每個(gè)<filled>元素在文檔中的順序(input item中的<filled>元素和<form>中的<filled>元素優(yōu)先權(quán)一樣)依次訪問(wèn)它們。那些匹配該utterance的<filled>元素被依次執(zhí)行,除非已經(jīng)沒(méi)有<filled>元素,或者出現(xiàn)控制跳轉(zhuǎn),或者拋出事件。 | | ????<filled>元素的屬性有: | mode | 值為all(默認(rèn))或any。如果值為any,當(dāng)任意一個(gè)指定的input item被用戶最近一次的輸入填充后,就執(zhí)行該<filled>元素的操作。如果值為all,當(dāng)所有提到的input item被填充,且用戶最后一次輸入填充了至少一個(gè)input item,就執(zhí)行該<filled>元素的操作。在input item中的<filled>元素不能指定該屬性。 | namelist | 要觸發(fā)的input item。對(duì)于<form>元素中的<filled>元素,該屬性默認(rèn)為該form中所有的input item變量(包括顯式和隱式)。一個(gè)input item中的<filled>元素則不能指定該屬性,這種情況下,namelist屬性值實(shí)際上就是該input item的名稱。注意control item不能出現(xiàn)在該屬性中。 |
| 表25:<filled>元素的屬性 |
第五節(jié) Links | ? | ? | ????<link>元素可以有一個(gè)或幾個(gè)語(yǔ)法,語(yǔ)法的作用域?yàn)榘?lt;link>元素的元素。該包含<link>元素的元素的scope屬性不會(huì)影響<link>元素中語(yǔ)法的作用域。<link>元素被包含于一個(gè)<form>元素中,該<form>元素的scope屬性為document,該<link>元素語(yǔ)法的作用域在該form內(nèi),而不是整個(gè)文檔。<link>元素中的<grammar>元素是不允許指定scope屬性的。當(dāng)這些語(yǔ)法中的一個(gè)被匹配,<link>元素被激活,要么跳轉(zhuǎn)到一個(gè)新的文檔或dialog(如<goto>),要么拋出一個(gè)事件(如<throw>)。 | | ????例如,當(dāng)用戶說(shuō)“books”或按“2”時(shí),<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> | | ????當(dāng)語(yǔ)法被匹配時(shí),下面的<link>元素動(dòng)態(tài)的決定要跳轉(zhuǎn)到當(dāng)前文檔的哪一個(gè)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>元素的語(yǔ)法在整個(gè)文檔中都是激活的;作為<form>的子元素,<link>元素的語(yǔ)法在該form中是激活的;如果應(yīng)用根文檔中有一個(gè)文檔級(jí)的<link>元素,它的語(yǔ)法在該應(yīng)用所有被加載的文檔中都是激活的。 | | ????如果在一個(gè)form item中執(zhí)行,且該form item的modal屬性為true,則form級(jí)或文檔級(jí)的<link>元素的語(yǔ)法是不激活的。 | | ????也可以定義一個(gè)<link>元素,當(dāng)語(yǔ)法匹配時(shí)拋出一個(gè)事件,而不是跳轉(zhuǎn)到一個(gè)新的文檔或dialog,該事件是在當(dāng)前執(zhí)行的地方被拋出,而不是在定義<link>元素的地方被拋出。例如,當(dāng)用戶的輸入匹配了<link>元素的語(yǔ)法或用戶按鍵輸入了"2",在用戶正在訪問(wèn)的form item的地方拋出了help事件,由該form item的作用域內(nèi)相應(yīng)的<catch>元素處理(詳見(jiàn)5.2.4節(jié))。 | | <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> | | ????當(dāng)匹配了<link>元素中的語(yǔ)法時(shí),application.lastresult$也被賦值,這樣才能允許呼叫流程在這個(gè)實(shí)際的語(yǔ)義結(jié)果的基礎(chǔ)上往下走。在5.1.5中有一個(gè)例子。 | | ????從概念上講,可以認(rèn)為<link>元素由兩部分組成:條件和操作。“條件”就是<link>元素的內(nèi)容,即它的語(yǔ)法,只有語(yǔ)法被匹配了,才能激活。“操作”由該元素的屬性指定,即要跳轉(zhuǎn)到哪里或拋出哪個(gè)事件。“條件”是靜態(tài)地解決/求值的,而“操作”則是動(dòng)態(tài)地解決/求值的。這意味著: | | ??????1、該<link>元素的內(nèi)容中的任何URI都是被靜態(tài)地求值的,即根據(jù)定義了<link>元素的文檔的基本URI求值(詳見(jiàn)1.5.1節(jié)的xml:base)。 | | ??????2、<link>元素屬性中的任何URI都是被動(dòng)態(tài)的求值的,即根據(jù)語(yǔ)法被匹配時(shí)正在執(zhí)行的文檔的基本URI求值。 | | ??????3、<link>元素的屬性中的任何ECMAScript表達(dá)式都是被動(dòng)態(tài)地求值的,即在語(yǔ)法被匹配時(shí)的作用域內(nèi)和執(zhí)行的環(huán)境中求值的。 | | ????<link>元素的屬性有: | next | 要跳轉(zhuǎn)到的URI,該URI是一個(gè)文檔(也許有段標(biāo)識(shí)符指定一個(gè)起始的dialog)或當(dāng)前文檔的一個(gè)dialog。 | expr | 和next屬性一樣,只不過(guò)該URI是根據(jù)給定的ECMAScript表達(dá)式動(dòng)態(tài)地求值的。 | event | 當(dāng)用戶匹配了<link>元素中的一個(gè)語(yǔ)法時(shí)要拋出的事件。 | eventexpr | 一個(gè)ECMAScript表達(dá)式,它的結(jié)果值為當(dāng)用戶匹配了<link>元素中的一個(gè)語(yǔ)法時(shí)要拋出的事件。 | message | 描述事件產(chǎn)生原因的文本信息。 | messageexpr | 一個(gè)ECMAScript表達(dá)式,它的結(jié)果值為描述事件產(chǎn)生原因的文本信息。 | dtmf | 該<link>元素的DTMF序列,它的作用等同于一個(gè)簡(jiǎn)單的DTMF語(yǔ)法,和應(yīng)用于該序列識(shí)別的DTMF<property>。它和DTMF語(yǔ)法不同的是,它的空格是不起作用的:dtmf=“123#”跟dtmf=“1 2 3 #”的效果是一樣的。該屬性能和其他的<grammar>同時(shí)使用。當(dāng)用戶的輸入匹配了<link>元素中的一個(gè)語(yǔ)法或DTMF序列,該<link>元素被 激活。 | fetchaudio | 見(jiàn)6.1節(jié)。它默認(rèn)為fetchaudio<property>的值。 | fetchhint | 見(jiàn)6.1節(jié)。它默認(rèn)為documentfetchhint<property>的值。 | fetchtimeout | 見(jiàn)6.1節(jié)。它默認(rèn)為fetchtimeout<property>的值。 | maxage | 見(jiàn)6.1節(jié)。它默認(rèn)為documentmaxage<property>的值。 | maxstale | 見(jiàn)6.1節(jié)。它默認(rèn)為documentmaxstale<property>的值。 |
| 表26:<link>元素的屬性 | | ????必須正確的指定屬性“next”,“expr”,“event”或“eventexpr”中的一個(gè),否則會(huì)拋出一個(gè)error.badfetch事件。必須正確的指定屬性“message”或“messageexpr”中的一個(gè),否則會(huì)拋出一個(gè)error.badfetch事件。 |
|
|
? |
|
|
|