• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            鐵觀音

            C++編程寶典

               ::  ::  ::  ::  :: 管理 ::
              1 隨筆 :: 19 文章 :: 0 評(píng)論 :: 0 Trackbacks
            第二章??Dialog的結(jié)構(gòu)
            ?
            第一節(jié) Forms ?
            ?
            ????form是VoiceXML文檔的主要組成部分,它包括以下幾個(gè)部分:
            ??????1、一組form item,即在FIA(form interpretation algorithm)的主循環(huán)被訪問(wèn)的一些元素。Form item可細(xì)分為input item和control item,input item可由用戶填充,而control item不能;
            ??????2、非form item(non-form item)變量的聲明;
            ??????3、事件處理;
            ??????4、填充后(filled)的操作,也就是當(dāng)某些input item的組合被賦值后要執(zhí)行的程序邏輯模塊。
            ????Form元素的屬性:
            id Form的名字。如果有指定的話,這個(gè)form就可以在該文檔內(nèi)被引用,或者在別的文檔中引用它。例如,<form id="weather">,<goto next="#weather">。
            scope 該form語(yǔ)法的默認(rèn)作用域(scope)。如果它的值為dialog,則該form語(yǔ)法只是在這個(gè)form里是激活的;如果它的值為document,則該form語(yǔ)法在這個(gè)文檔的任何對(duì)話中都是激活的;如果該文檔為應(yīng)用根文檔,則該form語(yǔ)法在這個(gè)應(yīng)用的任何文檔的任何dialog中都是激活的。注意,單獨(dú)的form的語(yǔ)法作用域的優(yōu)先權(quán)高于默認(rèn)的語(yǔ)法作用域。例如在非根文檔的某個(gè)form默認(rèn)的作用域?yàn)閐ialog,且有一個(gè)form語(yǔ)法的作用域?yàn)閐ocument,則該語(yǔ)法在這個(gè)文檔的任何對(duì)話中都是激活的。
            表3:<form>元素的屬性
            ????這一節(jié)描述了關(guān)于form的一些概念,并給出了它們的一些操作的具體例子。
            ?
            一、Form的解釋
            ????form由內(nèi)置的FIA解釋。FIA有一個(gè)主循環(huán)用來(lái)重復(fù)選定一個(gè)form item并訪問(wèn)它。被選定的form item是在文檔順序中第一個(gè)警戒條件不滿足的form item。例如,field的默認(rèn)警戒條件檢測(cè)看該field的form item變量是否有值。因此,如果一個(gè)簡(jiǎn)單的form只包含了幾個(gè)field,則每個(gè)field會(huì)順序地提示給用戶。
            ????解釋一個(gè)form item一般包括以下步驟:
            ??????1、選定并播放一個(gè)或多個(gè)prompt;
            ??????2、收集用戶的輸入,或填充一個(gè)或多個(gè)input item的響應(yīng),或一些事件的拋出(例如help);
            ??????3、解釋屬于最新的input item的填充的<filled>操作。
            ????FIA終止于解釋一個(gè)控制語(yǔ)句的跳轉(zhuǎn)(例如用<goto>元素到另一個(gè)對(duì)話或文檔,或者一個(gè)<submit>元素把數(shù)據(jù)提交到文檔服務(wù)器)。當(dāng)再?zèng)]有符合條件的form item可以被選定時(shí),F(xiàn)IA也隨著一個(gè)隱式的<exit>而中止。
            ????關(guān)于FIA更詳細(xì)的說(shuō)明見(jiàn)2.1.6節(jié)。
            ?
            二、Form Items
            ????form item就是在FIA的主循環(huán)中能夠被訪問(wèn)的元素。Input item控制FIA為特定的元素收集信息。當(dāng)FIA選定一個(gè)control item時(shí),該control item可以包含一個(gè)要執(zhí)行的代碼塊,或告訴FIA開(kāi)始為混合主動(dòng)式的form的提示和收集進(jìn)行初始化。
            ?
            ????<一>、Input Items
            ????input item指定了得到用戶輸入的input item變量。它有一些提示,告訴用戶要說(shuō)或者鍵入什么;還有定義允許的輸入的語(yǔ)法;還有處理一些由此產(chǎn)生的事件的事件處理。Input item也可以有<filled>元素,它定義了input item變量被填充以后要進(jìn)行的操作。Input item有以下幾個(gè):
            <field> 它的值是通過(guò)ASR或DTMF語(yǔ)法獲得的。
            <record> 它的值是用戶錄音的一段音頻。例如,<record>元素可以用來(lái)收集語(yǔ)音郵件的語(yǔ)音信息。
            <transfer> 它把用戶轉(zhuǎn)接到另一個(gè)電話號(hào)碼。如果該轉(zhuǎn)接返回控制,則把該轉(zhuǎn)接結(jié)果的狀態(tài)賦值給它的變量。
            <object> 它通過(guò)一些參數(shù)調(diào)用依賴于平臺(tái)的object,該object是一個(gè)ECMAScript Object。平臺(tái)的object可以是一個(gè)內(nèi)置的dialog,比如說(shuō)用來(lái)收集信用卡信息的dialog。也可以是用特定的DTMF文本方法收集文本消息的dialog。雖然當(dāng)依賴于平臺(tái)的object不被平臺(tái)支持時(shí),要拋出error.unsupported.objectname事件來(lái)處理<object>元素(專門的事件變量“_message”提供了更詳細(xì)的錯(cuò)誤信息,詳見(jiàn)5.2.2節(jié)),但是對(duì)于這些依賴于平臺(tái)的object的執(zhí)行卻是沒(méi)有任何限制的。
            <subdialog> <subdialog>有點(diǎn)像函數(shù)調(diào)用。它調(diào)用同一文檔中的另一個(gè)dialog,或者調(diào)用另一個(gè)文檔。它返回的是一個(gè)ECMAScript Object。
            表4:Input Items
            ?
            ????<二>、Control Items
            ????control item有兩種:
            <block> 它包含一些程序語(yǔ)句的序列,這些程序語(yǔ)句是用于提示和計(jì)算的,不是用于收集輸入的。<block>有一個(gè)form item變量(通常是隱含的),在它被解釋之前,該變量被置為true。
            <initial> 該元素用于在混合主動(dòng)式的form里控制最初的交互。它應(yīng)該提示用戶說(shuō)一些話來(lái)匹配一個(gè)form級(jí)別的語(yǔ)法。在<initial>元素的執(zhí)行中,當(dāng)至少有一個(gè)input item變量被識(shí)別結(jié)果所填充時(shí),<initial>元素的form item變量變?yōu)閠rue,從而把它置為不是FIA可選定的。
            表5:Control Items
            ?
            三、Form Item變量和條件
            ????每個(gè)form item都有一個(gè)和它相關(guān)的form item變量,當(dāng)進(jìn)入該form時(shí),它的默認(rèn)值為undefined。Input item的form item變量包含了解釋該form item的結(jié)果。Input item的form item變量也稱為input item變量(Input item variable),它保存了從用戶那里收集到的值。Input item變量可以用name屬性給它命名;或讓它匿名,此時(shí)會(huì)產(chǎn)生一個(gè)內(nèi)部名稱。
            ????每個(gè)form item也有一個(gè)警戒條件,它決定該form item是否能夠被FIA選定。默認(rèn)的警戒條件只是檢測(cè)該form item是否有非undefined的值,如果有,該form item就不會(huì)被訪問(wèn)。
            ????通常,input item都會(huì)有名稱,control item都沒(méi)有名稱;form item變量都沒(méi)有被賦初始值,且沒(méi)有指定附加的警戒條件。但有些時(shí)候需要更精確地控制。如:form可以在開(kāi)始的時(shí)候給一個(gè)form item 變量賦初始值來(lái)跳過(guò)相應(yīng)的field的執(zhí)行,然后清零(如用<clear>元素)并強(qiáng)制該field重新被選定;另一個(gè)field可以有一個(gè)警戒條件,只有當(dāng)該field沒(méi)有被選定過(guò),且其他兩個(gè)field已經(jīng)被填充時(shí)才激活它;或只有當(dāng)某個(gè)條件為true時(shí),<block>才能執(zhí)行。這樣一來(lái),哪些form item會(huì)被FIA選定并執(zhí)行的順序可以得到更好的控制。然而,通常很多對(duì)話都可以不用這么復(fù)雜。
            ????總的來(lái)說(shuō),所有的form item都有如下的屬性:
            name 該form item變量的名稱,作用域?yàn)閐ialog。它保存了該form item的值。
            expr 給form item變量賦初始值,默認(rèn)的初始值為ECMAScript 的undefined 。如果有初始值,則該form item不會(huì)被執(zhí)行,除非該form item變量被清零。
            cond 它是一個(gè)表達(dá)式的值,如果缺省,默認(rèn)值為true。如果是在<initial>元素里,它用來(lái)檢測(cè)是否有input item被填充了。
            表6:Form Item共有的屬性
            ?
            四、Directed Forms
            ????最簡(jiǎn)單、最普通的form類型是,在computer-directed交互中,該form的form 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="weather_info">
                     <block>Welcome to the weather information service.</block>
                     <field name="state">
                       <prompt>What state?</prompt>
                       <grammar src="state.grxml"  type="application/srgs+xml"/>
                       <catch event="help">
                          Please speak the state for which you want the weather.
                       </catch>
                     </field>
                     <field name="city">
                       <prompt>What city?</prompt>
                       <grammar src="city.grxml" type="application/srgs+xml"/>
                       <catch event="help">
                          Please speak the city for which you want the weather.
                       </catch>
                     </field>
                     <block>
                       <submit next="/servlet/weather" namelist="city state"/>
                     </block>
                    </form>
                  </vxml>
            ????該對(duì)話執(zhí)行的順序?yàn)椋?/td>
                  C (computer): Welcome to the weather information service. What state?
                  H (human): Help.
                  C: Please speak the state for which you want the weather.
                  H: Georgia.
                  C: What city?
                  H: Tblisi.
                  C: I did not understand what you said. What city?
                  H: Macon.
                  C: The conditions in Macon Georgia are sunny and clear at 11 AM ...
            ????FIA的第一次循環(huán)選定時(shí),選定了第一個(gè)block,因?yàn)樗膄orm item變量(隱含的)值為undefined。該block輸出了它的提示語(yǔ),且它的form item變量被置為true。在FIA的第二次反復(fù)選定時(shí),略過(guò)了第一個(gè)block,因?yàn)樗膄orm item變量值不為undefined,此時(shí)FIA選定了名為“state”的field,因?yàn)樵揻ield的變量state的值為undefined。該field提示用戶輸入州名,然后把變量state置為用戶輸入的答案。關(guān)于field級(jí)的語(yǔ)法填充form item變量的具體描述見(jiàn)3.1.6節(jié)。第三次提示并收集名稱為city的field。第四次執(zhí)行了最后的block,并跳轉(zhuǎn)到另外一個(gè)URI。
            ????這個(gè)例子里的每個(gè)field都有播放一段提示語(yǔ)引導(dǎo)用戶輸入,有一個(gè)語(yǔ)法指定要監(jiān)聽(tīng)的內(nèi)容,有help事件的事件處理。無(wú)論何時(shí),只要用戶要求幫助,help事件就會(huì)被拋出。Help事件處理捕獲這些事件并播放一段更詳細(xì)的提示語(yǔ)。
            ????下面還有一個(gè)機(jī)器主導(dǎo)的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 id="get_card_info">
                     <block>We now need your credit card type, number, and expiration date.</block>
                     <field name="card_type">
                       <prompt count="1">What kind of credit card do you have?</prompt>
                       <prompt count="2">Type of card?</prompt>
                       <!-- This is an inline grammar. -->
                       <grammar type="application/srgs+xml" root="r2" version="1.0">
                         <rule id="r2" scope="public">
                          <one-of>
                           <item>visa</item>
                           <item>master<item repeat="0-1">card</item></item>
                           <item>amex</item>
                           <item>american express</item>
                          </one-of>
                        </rule>
                      </grammar>
                      <help>Please say Visa, Mastercard, or American Express.</help>
                      </field>
                      <field name="card_num">
                       <grammar type="application/srgs+xml" src="/grammars/digits.grxml"/>
                       <prompt count="1">What is your card number?</prompt>
                       <prompt count="2">Card number?</prompt>
                       <catch event="help">
                         <if cond="card_type =='amex' || card_type =='american express'">
                           Please say or key in your 15 digit card number.
                      <else/>
                           Please say or key in your 16 digit card number.
                      </if>
                     </catch>
                      <filled>
                       <if cond="(card_type == 'amex' || card_type =='american express') && card_num.length != 15">
                           American Express card numbers must have 15 digits.
                         <clear namelist="card_num"/>
                         <elseif cond="card_type != 'amex'&& card_type !='american express'&& card_num.length != 16"/>
                           Mastercard and Visa card numbers have 16 digits.
                         <clear namelist="card_num"/>
                         <throw event="nomatch"/>
                       </if>
                      </filled>
                    </field>
            										
                    <field name="expiry_date">
                      <grammar type="application/srgs+xml" src="/grammars/digits.grxml"/>
                      <prompt count="1">What is your card's expiration date?</prompt>
                      <prompt count="2">Expiration date?</prompt>
                      <help>
                         Say or key in the expiration date, for example one two oh one.
                      <filled>
                        <!-- validate the mmyy -->
                        <var name="mm"/>
                        <var name="i" expr="expiry_date.length"/>
                        <if cond="i == 3">
                          <assign name="mm" expr="expiry_date.substring(0,1)"/>
                        <elseif cond="i == 4"/>
                          <assign name="mm" expr="expiry_date.substring(0,2)"/>
                        </if>
                        <if cond="mm == '' || mm < 1 || mm > 12">
                         <clear namelist="expiry_date"/>
                         <throw event="nomatch"/>
                        </if>
                      </filled>
                     </field>
            										
                     <field name="confirm">
                       <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
                       <prompt>
                          I have <value expr="card_type"/> number
                         <value expr="card_num"/&> expiring on
                         <value expr="expiry_date"/>.
                          Is this correct?
                       </prompt>
                       <filled>
                         <if cond="confirm">
                           <submit next="place_order.asp" namelist="card_type card_num expiry_date"/>
                         </if>
                         <clear namelist="card_type card_num expiry_date confirm"/>
                       </filled>
                     </field>
                    </form>
                  </vxml>
            ????注意:語(yǔ)法的可選項(xiàng)‘a(chǎn)mex’和‘a(chǎn)merican express’返回的真實(shí)值需要在條件表達(dá)式中分開(kāi)處理。3.1.5節(jié)描述了語(yǔ)法中的語(yǔ)義元素怎樣才能對(duì)多種輸入返回一個(gè)單獨(dú)的值。
            ????該對(duì)話的流程可能是這樣的:
                  C: We now need your credit card type, number, and expiration date.
                  C: What kind of credit card do you have?
                  H: Discover.
                  C: I did not understand what you said. (a platform-specific default message.) 
                  C: Type of card? (the second prompt is used now.)
                  H: Shoot. (fortunately treated as "help" by this platform)
                  C: Please say Visa, Master card, or American Express.
                  H: Uh, Amex. (this platform ignores "uh") 
                  C: What is your card number?
                  H: One two three four ... wait ...
                  C: I did not understand what you said.
                  C: Card number?
                  H: (uses DTMF) 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 #
                  C: What is your card's expiration date?
                  H: one two oh one
                  C: I have Amex number 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 expiring on 1 2 0 1. Is this correct?
                  H: Yes.
            ????Field是form的主要組成元素。Field聲明了一個(gè)變量并指定了相應(yīng)的提示語(yǔ)、語(yǔ)法、DTMF序列、幫助信息和其他一些事件處理。每個(gè)field聲明了一個(gè)VoiceXML form item變量,它的作用域?yàn)樵揻orm的dialog。該field被填充后,它的變量可以被提交,也可以賦值給其他的變量。
            ????每個(gè)field有它自己的語(yǔ)音和(或)DTMF語(yǔ)法,既可以明確的使用<grammar>元素指定,也可以用type屬性隱含地指定。Type屬性用于指定內(nèi)置的語(yǔ)法,像digits、boolean或number。
            ????每個(gè)field可以有一個(gè)或多個(gè)提示語(yǔ)。如果有一個(gè)提示語(yǔ),它會(huì)被反復(fù)地播放給用戶,直到用戶輸入信息。若有多個(gè)提示語(yǔ)則根據(jù)提示語(yǔ)選擇算法來(lái)選定提示語(yǔ)(詳見(jiàn)4.1.6節(jié))。在每次要播放提示語(yǔ)的時(shí)候,count屬性可以決定用哪一條提示語(yǔ)。在這個(gè)例子,提示語(yǔ)越變?cè)蕉蹋@叫做錐形提示(tapered prompting:語(yǔ)音提示漸漸地簡(jiǎn)短而精煉,或越來(lái)越精細(xì))。
            ????<catch event="help">元素是一個(gè)事件處理,它定義了當(dāng)用戶請(qǐng)求幫助時(shí)該做什么。幫助信息也可以是分級(jí)的。這些信息可以簡(jiǎn)化,下面兩個(gè)元素的效果是等同的。
                  <catch event="help">
                     Please say visa, mastercard, or amex.
                  </catch>
            										
                  <help>
                     Please say visa, mastercard, or amex.
                  </help>
            ????<filled>元素定義的是,當(dāng)用戶提供了相應(yīng)field要識(shí)別的輸入后該做什么。一個(gè)用途就是在語(yǔ)法檢查之后再指定一套完整的約束,像上面例子中名為expiry_date的field。
            ?
            五、Mixed Initiative Forms
            ????上一節(jié)我們討論了執(zhí)行嚴(yán)格的,由計(jì)算機(jī)主導(dǎo)的會(huì)話,要實(shí)現(xiàn)混合主動(dòng)式的form,即計(jì)算機(jī)和用戶共同主導(dǎo)該會(huì)話,必須有一個(gè)或多個(gè)form級(jí)別的語(yǔ)法。這種會(huì)話的編寫(xiě)有幾種方式,其中一種普遍的方式是使用<initial>元素和<field>元素,<initial>元素用來(lái)獲得全面的信息,而<field>元素用來(lái)獲得特定的信息。下面的例子說(shuō)明了這一點(diǎn)。其他一些更復(fù)雜的技巧也可以取得同樣的效果,例如使用<initial>元素的cond屬性。
            ????如果某個(gè)form擁有幾個(gè)form級(jí)別的語(yǔ)法,那么:
            ??????1、它的input item在任何順序中都能夠被填充;
            ??????2、用戶的一個(gè)utterance就可以填充一個(gè)以上的input item。
            ????只有input item能夠被form級(jí)別的語(yǔ)法的匹配結(jié)果填充,control item不能。關(guān)于form級(jí)別的語(yǔ)法填充field變量的描述見(jiàn)3.1.6節(jié)。
            ????當(dāng)用戶在其他的對(duì)話內(nèi),form級(jí)別的語(yǔ)法也可能是激活的。假如某個(gè)文檔有兩個(gè)form,一個(gè)是汽車租金的form,另一個(gè)是酒店預(yù)定的form,它們都有在整個(gè)文檔激活的語(yǔ)法,在和酒店預(yù)定的form交互的時(shí)候,用戶可以輸入汽車租金的信息,引導(dǎo)計(jì)算機(jī)到汽車租金的form里。用戶可以根據(jù)任何激活的語(yǔ)法講話,填充input item和進(jìn)行相應(yīng)的操作。
            ????例子。下面的例子是天氣信息服務(wù)的第二個(gè)版本,是混合主動(dòng)式的。這個(gè)例子為了增強(qiáng)它的說(shuō)明性,加入了廣告和城市名及州名的確認(rè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="weather_info">
                     <grammar src="cityandstate.grxml" type="application/srgs+xml"/>
                     <!-- Caller can't barge in on today's advertisement. -->
                     <block>
                       <prompt bargein="false">
                         Welcome to the weather information service.
                         <audio src="http://www.online-ads.example.com/wis.wav"/>
                       </prompt>
                      </block>
            										
                     <initial name="start">
                       <prompt>
                          For what city and state would you like the weather?
                       </prompt>
                       <help>
                         Please say the name of the city and state for which you would like a weather report.
                      </help>
                      <!-- If user is silent, reprompt once, then try directed prompts. -->
                      <noinput count="1"><reprompt/></noinput>
                      <noinput count="2"><reprompt/><assign name="start" expr="true"/></noinput>
                     </initial>
            										
                     <field name="state">
                       <prompt>What state?</prompt>
                         <help>
                           Please speak the state for which you want the weather.
                        </help>
                     </field>
            										
                     <field name="city">
                       <prompt>Please say the city in <value expr="state"/>for which you want the weather.</prompt>
                       <help>Please speak the city for which you want the weather.</help>
                       <filled>
                         <!-- Most of our customers are in LA. -->
                         <if cond="city == 'Los Angeles' && state == undefined">
                           <assign name="state" expr="'California'"/>
                         </if>
                       </filled>
                     </field>
            										
                    <field name="go_ahead" modal="true">
                      <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
                      <prompt>Do you want to hear the weather for <value expr="city"/>, <value expr="state"/>?</prompt>
                      <filled>
                        <if cond="go_ahead">
                          <prompt bargein="false">
                            <audio src="http://www.online-ads.example.com/wis2.wav"/>
                         </prompt>
                         <submit next="/servlet/weather" namelist="city state"/>
                        </if>
                        <clear namelist="start city state go_ahead"/>
                       </filled>
                     </field>
                    </form>
                  </vxml>
            ????下面是該例子的一個(gè)可能的流程,它顯示了它的優(yōu)勢(shì),即使該用戶是個(gè)新手:
                  C: Welcome to the weather information service. Buy Joe's Spicy Shrimp Sauce.
                  C: For what city and state would you like the weather?
                  H: Uh, California.
                  C: Please say the city in California for which you want the weather.
                  H: San Francisco, please.
                  C: Do you want to hear the weather for San Francisco, California?
                  H: No
                  C: For what city and state would you like the weather?
                  H: Los Angeles.
                  C: Do you want to hear the weather for Los Angeles, California?
                  H: Yes
                  C: Don't forget, buy Joe's Spicy Shrimp Sauce tonight!
                  C: Mostly sunny today with highs in the 80s. Lows tonight from the low 60s ...
            ????名稱為go_ahead的field有一個(gè)modal屬性,它的值為true,它的作用是使所有的語(yǔ)法都失效,除了當(dāng)前form item中定義的那個(gè)語(yǔ)法,因此,在該field中只有boolean語(yǔ)法是激活的。
            ????有經(jīng)驗(yàn)的用戶可以更快的完成流程,但是他還是必須要聽(tīng)廣告:
                  C: Welcome to the weather information service. Buy Joe's Spicy Shrimp Sauce.
                  C: What ...
                  H (barging in): LA.
                  C: Do you ...
                  H (barging in): Yes.
                  C: Don't forget, buy Joe's Spicy Shrimp Sauce tonight!
                  C: Mostly sunny today with highs in the 80s. Lows tonight from the low 60s ...
            ????Controlling the order of field collection.
            ????FIA可以用多種方式定制。其中一種方法是給一個(gè)form item變量賦值,這樣該form item就不會(huì)被選定了;另一種方法是用<clear>把form item變量置為undefined,強(qiáng)制FIA再次訪問(wèn)該form item。
            ????還有一種是用<goto>元素的nextitem屬性明確地指定下一個(gè)要訪問(wèn)的form item,該方法強(qiáng)加了一個(gè)到目標(biāo)form item 的立即跳轉(zhuǎn)。目標(biāo)form item的變量、條件和計(jì)數(shù)器都不會(huì)被重置。即使該form item已經(jīng)被訪問(wèn)過(guò),他的提示語(yǔ)還是會(huì)播放的。如果<goto nextitem>跳轉(zhuǎn)出現(xiàn)在<filled>中,該<filled>剩下的操作和任何掛起的<filled>操作都會(huì)被跳過(guò)。
            ????下面這個(gè)例子中<goto nextitem>出現(xiàn)在exit事件的事件處理中:
                  <?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="survey_2000_03_30">
                       <catch event="exit">
                         <reprompt/>
                         <goto nextitem="confirm_exit"/>
                       </catch>
                       <block>
                         <prompt>
                            Hello, you have been called at random to answer questions critical to U.S. foreign policy.
                         </prompt>
                       </block>
            										
                       <field name="q1">
                         <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
                         <prompt>Do you agree with the IMF position on privatizing
                             certain functions of Burkina Faso's agriculture ministry?</prompt>
                      </field>
            										
                      <field name="q2">
                       <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
                         <prompt>If this privatization occurs, will its effects be
                              beneficial mainly to Ouagadougou and Bobo-Dioulasso?</prompt>
                     </field>
            										
                      <field name="q3">
                       <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
                         <prompt>Do you agree that sorghum and millet output might
                               thereby increase by as much as four percent per annum?</prompt>
                     </field>
            										
                     <block>
                       <submit next="register" namelist="q1 q2 q3"/>
                     </block>
            										
                    <field name="confirm_exit">
                       <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
                       <prompt>You have elected to exit.  Are you sure you want to do this, and perhaps 
                         adversely affect U.S. foreign policy vis-a-vis sub-Saharan Africa for decades 
                         to come?</prompt>
            										
                     <filled>
                       <if cond="confirm_exit">
                         Okay, but the U.S. State Department is displeased.
                         <exit/>
                        <else/>
                         Good, let's pick up where we left off.
                         <clear namelist="confirm_exit"/>
                        </if>
                      </filled>
                      <catch event="noinput nomatch">
                        <throw event="exit"/>
                      </catch>
                     </field>
                    </form>
                  </vxml>
            ????無(wú)論用戶在哪個(gè)要收集的問(wèn)題中說(shuō)“exit”,平臺(tái)都會(huì)拋出exit事件,并由<catch>元素的事件處理捕獲。該事件處理把FIA引導(dǎo)到下一個(gè)要訪問(wèn)的field,“confirm_exit”。confirm_exit域在正常的調(diào)查完成過(guò)程中將不再被訪問(wèn),因?yàn)槠淝懊娴?lt;block>元素將控制轉(zhuǎn)向“register”腳本。
            ?
            六、Form Interpretation Algorithm
            ????我們已經(jīng)從概念上討論了FIA,在這一節(jié),我們將更詳細(xì)地討論它(更詳細(xì)的描述見(jiàn)附錄C)。
            ?
            ????<一>、Initialization Phase
            ????FIA只要進(jìn)入一個(gè)form就會(huì)初始化它。內(nèi)部的提示語(yǔ)計(jì)數(shù)器變量(在form的dialog作用域內(nèi))被置為1。每個(gè)變量(form級(jí)別的<var>元素和form item變量)根據(jù)在文檔中的順序被一一初始化為undefined和相應(yīng)的expr屬性的值。
            ?
            ????<二>、Main Loop
            ????FIA的主循環(huán)有三個(gè)階段:
            ????選定(select)階段:選定下一個(gè)沒(méi)有被填充的form item供訪問(wèn)。
            ????收集(collect)階段:訪問(wèn)被選定的form item,播放它的提示語(yǔ)讓用戶輸入,激活相應(yīng)的語(yǔ)法,等待收集用戶的輸入(例如語(yǔ)音或DTMF按鍵輸入)或者事件(例如請(qǐng)求幫助或noinput timeout)。
            ????處理(process)階段:處理用戶輸入,填充form item并執(zhí)行<filled>元素的操作,例如確認(rèn)輸入;處理事件,執(zhí)行該事件相應(yīng)的事件處理。
            ????注意:FIA可以被給定一個(gè)輸入(一組語(yǔ)法槽值(grammar slot/slot value pairs)),該輸入是用戶在另外一個(gè)FIA時(shí)被收集到的。在這種情況下,主循環(huán)的第一次循環(huán)跳過(guò)了選定和收集階段,直接跳到處理階段,使用給定的輸入處理。另一個(gè)要注意的是,如果在選定或收集階段有錯(cuò)誤發(fā)生,產(chǎn)生一個(gè)事件,該事件被拋出,F(xiàn)IA也直接跳到處理階段。
            ?
            ??????1、Select phase
            ??????選定階段的目的是選定下一個(gè)要訪問(wèn)的form item,當(dāng)出現(xiàn)以下情況時(shí),選定階段結(jié)束:
            ??????如果上一次主循環(huán)的處理階段指定了一個(gè)<goto nextitem>,則該指定的form item被選定。
            ??????另外,如果第一個(gè)form item的警戒條件為false,則該form item被選定。在檢查警戒條件時(shí),如果發(fā)生錯(cuò)誤,事件被拋出,F(xiàn)IA跳過(guò)收集階段,進(jìn)入處理階段,處理該事件。
            ??????如果沒(méi)有任何form item的警戒條件為false,且FIA最后一次循環(huán)完成時(shí)沒(méi)有碰到明確的控制跳轉(zhuǎn),F(xiàn)IA會(huì)執(zhí)行一個(gè)隱含的<exit>操作(類似的,如果執(zhí)行是在form 之外,例如當(dāng)在form之外產(chǎn)生一個(gè)錯(cuò)誤時(shí),沒(méi)有任何明確的控制跳轉(zhuǎn),解釋器將執(zhí)行一個(gè)隱含的<exit>操作)。
            ?
            ??????2、Collect phase
            ??????收集階段的目的是收集用戶輸入或事件。當(dāng)一個(gè)form item被選定時(shí),F(xiàn)IA要執(zhí)行的操作取決于該form item的類型:
            ??????如果訪問(wèn)的是一個(gè)field item,F(xiàn)IA根據(jù)該field item的提示語(yǔ)計(jì)數(shù)器和提示語(yǔ)條件選定提示語(yǔ),進(jìn)行排隊(duì),然后激活并監(jiān)聽(tīng)該field級(jí)別的語(yǔ)法和任何其他更高級(jí)別的激活的語(yǔ)法,等待語(yǔ)法識(shí)別和某個(gè)事件。
            ??????如果訪問(wèn)的是<transfer>,F(xiàn)IA根據(jù)提示語(yǔ)計(jì)數(shù)器和提示語(yǔ)條件對(duì)提示語(yǔ)進(jìn)行排隊(duì),激活該item的語(yǔ)法,在該transfer執(zhí)行前播放它的提示語(yǔ)隊(duì)列。
            ??????如果訪問(wèn)的是<subdialog>或<object>,F(xiàn)IA根據(jù)提示語(yǔ)計(jì)數(shù)器和提示語(yǔ)條件對(duì)提示語(yǔ)進(jìn)行排隊(duì),F(xiàn)IA沒(méi)有激活語(yǔ)法,相反,執(zhí)行環(huán)境給subdialog或object指定了收集輸入的行為。在執(zhí)行subdialog或object之前不播放提示語(yǔ)隊(duì)列,而應(yīng)該在后來(lái)的輸入收集的時(shí)候播放。
            ??????如果訪問(wèn)的是<initial>,F(xiàn)IA根據(jù)該<initial>的提示語(yǔ)計(jì)數(shù)器和提示語(yǔ)條件選定提示語(yǔ),進(jìn)行排隊(duì),然后監(jiān)聽(tīng)form級(jí)別的語(yǔ)法和其他更高級(jí)別的激活的語(yǔ)法,等待語(yǔ)法識(shí)別和某個(gè)事件。
            ??????如果訪問(wèn)的是<block>,F(xiàn)IA把它的form item 變量置為true,對(duì)它的內(nèi)容求值,跳過(guò)處理階段,沒(méi)有收集任何輸入,F(xiàn)IA主循環(huán)的下一次循環(huán)進(jìn)入該<block>。
            ?
            ??????3、Process phase
            ??????處理階段的目的是處理上一個(gè)階段收集到的輸入或事件。
            ????????(1)、如果出現(xiàn)一個(gè)事件(如noinput或掛機(jī)),F(xiàn)IA確定該應(yīng)用的catch元素并執(zhí)行它,該應(yīng)用catch元素在當(dāng)前form item 的范圍內(nèi)選定,在該會(huì)話封裝的范圍內(nèi)進(jìn)行,這樣可能會(huì)導(dǎo)致該FIA終止(例如,如果它跳轉(zhuǎn)到一個(gè)對(duì)話或文檔,或執(zhí)行了<exit>),或者可能導(dǎo)致FIA進(jìn)入主循環(huán)的下一個(gè)循環(huán)(如,執(zhí)行幫助的默認(rèn)事件處理)。
            ????????(2)、如果某個(gè)輸入匹配了<link>語(yǔ)法,則FIA執(zhí)行該link的跳轉(zhuǎn),或者拋出它的事件,如果<link>拋出一個(gè)事件,事件在當(dāng)前的form item(如<initial>、 <field>、<transfer>等等)的環(huán)境下處理。
            ????????(3)、如果輸入匹配了一個(gè)不同于當(dāng)前form的另一個(gè)form的語(yǔ)法,該FIA終止,另一個(gè)form被初始化,該form的FIA帶著這個(gè)輸入直接進(jìn)入它的處理階段。
            ??????如果某個(gè)輸入匹配了該form的語(yǔ)法,則:
            ????????(1)、該語(yǔ)法的語(yǔ)義結(jié)果被映射到一個(gè)或多個(gè)form item變量,詳細(xì)描述見(jiàn)3.1.6節(jié);
            ????????(2)、FIA標(biāo)識(shí)這些賦值所觸發(fā)的<filled>操作,詳細(xì)描述見(jiàn)24節(jié);
            ????????(3)、FIA根據(jù)它們?cè)谖臋n中的順序執(zhí)行每個(gè)<filled>操作。如果遇到<submit>、<disconnect>、<exit>、<return>、<goto>或者<throw>元素,就不會(huì)再執(zhí)行剩下的<filled>元素了,F(xiàn)IA要么終止,要么繼續(xù)主循環(huán)的下一個(gè)循環(huán)。<reprompt>不會(huì)終止FIA(終止意味著一個(gè)操作),只是相當(dāng)于給相應(yīng)的prompt做個(gè)標(biāo)記,讓FIA在下一次循環(huán)再次播放prompt。如果在執(zhí)行某個(gè)<filled>時(shí)拋出一個(gè)事件,F(xiàn)IA將在該<filled>的作用域內(nèi)開(kāi)始選定事件處理,該作用域可以是一個(gè) form item或者該form自己,然后在該dialog作用域外處理。
            ??????在完成處理階段后,解釋器繼續(xù)返回到選定階段。
            ????關(guān)于FIA更詳細(xì)的描述見(jiàn)附錄C。

            第二節(jié) Menus ?
            ?
            ????menu在語(yǔ)法上是一個(gè)form的另一種形式,該form包含了單個(gè)的匿名的field。menu提示選擇一個(gè)選項(xiàng),并根據(jù)該選項(xiàng)跳轉(zhuǎn)到相應(yīng)的dialog。就像一個(gè)正規(guī)的form一樣, menu也有它自己的語(yǔ)法作用域,例如當(dāng)用戶在執(zhí)行另一個(gè)dialog時(shí),它的語(yǔ)法也可以是激活的。下面的例子中,menu給用戶提供了3個(gè)選項(xiàng):
                  <?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">
                    <menu>
                      <prompt>
                         Welcome home. Say one of: <enumerate/>
                      </prompt>
                      <choice next="http://www.sports.example.com/vxml/start.vxml">
                         Sports
                      </choice>
                      <choice next="http://www.weather.example.com/intro.vxml">
                         Weather
                      </choice>
                      <choice next="http://www.stargazer.example.com/voice/astronews.vxml">
                          Stargazer astrophysics news
                      </choice>
                     <noinput>Please say one of <enumerate/></noinput>
                    </menu>
                  </vxml>
            ????下面是該dialog可能的流程:
                  C: Welcome home. Say one of: sports; weather; Stargazer astrophysics news.
                  H: Astrology.
                  C: I did not understand what you said. (a platform-specific default message.) 
                  C: Welcome home. Say one of: sports; weather; Stargazer astrophysics news.
                  H: sports.
                  C: (proceeds to http://www.sports.example.com/vxml/start.vxml) 
            ?
            一、MENU
            ????<menu>元素可以標(biāo)識(shí)一個(gè)菜單,并確定它的語(yǔ)法的作用域。Menu的屬性如下:
            id Menu的標(biāo)識(shí)符,它允許dialog通過(guò)<goto>或<submit>跳轉(zhuǎn)到該menu。
            scope Menu的語(yǔ)法作用域。如果它的值為“dialog”,只有當(dāng)用戶跳轉(zhuǎn)到該menu,它的語(yǔ)法才是激活的。如果它的值為“document”,它的語(yǔ)法在整個(gè)文檔內(nèi)(或者,如果該menu在應(yīng)用根文檔里,在該應(yīng)用中,所有加載的文檔內(nèi))都是激活的。
            dtmf 當(dāng)它的值為“true”,前九個(gè)choice如果沒(méi)有明確的指定dtmf屬性,則它們會(huì)得到隱含的dtmf屬性,如“1”、“2”等。剩下的那些沒(méi)有明確指定dtmf屬性的choice不會(huì)得到DTMF值(因此它們不能通過(guò)DTMF按鍵來(lái)匹配)。此時(shí),如果該menu有choice指定了它自己的DTMF序列,該序列包含除了“*”、“#”或“0”以外的字符,平臺(tái)要拋出error.badfetch 事件。該屬性默認(rèn)值為“false”。
            accept 當(dāng)它的值為“exact”(該值為默認(rèn)值),則該menu中的choice元素的文本定義的是要識(shí)別的精確的短語(yǔ)。如果它的值為“approximate”,則該menu中的choice元素的文本定義的是要識(shí)別的近似的短語(yǔ)(如2.2.5節(jié)中描述的)。<choice>的accept屬性的優(yōu)先權(quán)高于menu的該屬性。
            表7:<menu>元素的屬性
            ?
            二、CHOICE
            ????<choice>元素有下面幾個(gè)作用:
            ??????1、它可以指定一個(gè)語(yǔ)音語(yǔ)法,用<grammar>元素定義或由程序自動(dòng)產(chǎn)生,詳細(xì)描述見(jiàn)2.2.5節(jié);
            ??????2、它可以指定一個(gè)DTMF語(yǔ)法,詳見(jiàn)2.2.3節(jié);
            ??????3、它的內(nèi)容可以作為<enumerate>的提示語(yǔ),詳見(jiàn)2.2.4節(jié);
            ??????4、當(dāng)某個(gè)選項(xiàng)被選擇的話,它要么指定了要拋出的事件,要么指定了要跳轉(zhuǎn)的URI。
            ????<choice>的屬性有:
            dtmf 該<choice>元素的DTMF序列。它的作用等同于一個(gè)簡(jiǎn)單的DTMF語(yǔ)法,或者應(yīng)用于該序列識(shí)別的DTMF property(6.3.3節(jié))。它和DTMF不同的是,它的空格是不起作用的:dtmf=“123#”和 dtmf=“1 2 3 #”是等同的。
            accept 該<choice>元素的“accept”屬性的優(yōu)先權(quán)高于所在的<menu>元素的“accept”屬性。當(dāng)該屬性的值為“exact”(默認(rèn)),<choice>元素的文本定義了要識(shí)別的精確的短語(yǔ);當(dāng)該屬性值為“approximate”,<choice>元素的文本定義的是要識(shí)別的近似的短語(yǔ)(詳見(jiàn)2.2.5節(jié))。
            next 要跳轉(zhuǎn)的下一個(gè)對(duì)話或文檔。
            expr 一個(gè)表達(dá)式,它的值為要跳轉(zhuǎn)的URI,而不指定“next”屬性。
            event 指定一個(gè)要拋出的事件,而不指定“next”屬性。
            eventexpr 一個(gè)ECMAScript表達(dá)式,它的值為要拋出的事件名。
            message 一個(gè)信息串,它提供了關(guān)于要拋出的事件的上下文。在<catch>元素的作用域內(nèi)用變量“_message”可以得到該信息串,詳見(jiàn)5.2.2。
            messageexpr 一個(gè) ECMAScript表達(dá)式 ,它的值為一個(gè)信息串。
            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的值。
            表8:<choice>元素的屬性
            ????必須正確地指定屬性“next”、“expr”、“event”和“eventexpr”中的一個(gè),否則會(huì)拋出error.badfetch事件。也可以正確地指定屬性“message”或“messageexpr”中的一個(gè),否則會(huì)拋出error.badfetch事件。
            ????如果在<choice>中指定了一個(gè)<grammar>元素,則該外部語(yǔ)法用于替換自動(dòng)產(chǎn)生的語(yǔ)法。這樣開(kāi)發(fā)者就可以準(zhǔn)確地控制<choice>元素的語(yǔ)法,例如:
                  <?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">
                    <menu>
                      <choice next="http://www.sports.example.com/vxml/start.vxml">
                         <grammar src="sports.grxml" type="application/srgs+xml"/>
                         Sports
                      </choice>
                      <choice next="http://www.weather.example.com/intro.vxml">
                         <grammar src="weather.grxml" type="application/srgs+xml"/>
                         Weather
                      </choice>
                      <choice next="http://www.stargazer.example.com/voice/astronews.vxml">
                         <grammar src="astronews.grxml" type="application/srgs+xml"/>
                          Stargazer astrophysics
                      </choice>
                    </menu>
                  </vxml>
            ?
            三、DTMF in Menus
            ????menu可以只有語(yǔ)音語(yǔ)法,也可以只有DTMF語(yǔ)法,也可以在<menu>中包含一個(gè)<property>元素同時(shí)指定DTMF和語(yǔ)音語(yǔ)法。下面的例子中的menu只有DTMF語(yǔ)法,并且使用<choice>元素的dtmf屬性給每個(gè)<choice>元素顯式的指定了DTMF序列:
                  <?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">
                    <menu>
                      <property name="inputmodes" value="dtmf"/>
                      <prompt>
                         For sports press 1, For weather press 2, For Stargazer astrophysics press 3.
                      </prompt>
                      <choice dtmf="1" next="http://www.sports.example.com/vxml/start.vxml"/>
                      <choice dtmf="2" next="http://www.weather.example.com/intro.vxml"/>
                      <choice dtmf="3" next="http://www.stargazer.example.com/astronews.vxml"/>
                    </menu>
                  </vxml>
            ????另外,也可以把<menu>元素的dtmf屬性置為true,自動(dòng)的為前九個(gè)沒(méi)有指定DTMF序列的<choice>元素指定一個(gè)DTMF序列,第一個(gè)為“1”,等等:
                  <?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">
                    <menu dtmf="true">
                      <property name="inputmodes" value="dtmf"/>
                      <prompt>
                         For sports press 1, For weather press 2, For Stargazer astrophysics press 3.
                      </prompt>
                      <choice next="http://www.sports.example.com/vxml/start.vxml"/>
                      <choice next="http://www.weather.example.com/intro.vxml"/>
                      <choice dtmf="0" next="#operator"/>
                      <choice next="http://www.stargazer.example.com/voice/astronews.vxml"/>
                    </menu>
                  </vxml>
            ?
            四、ENUMERATE
            ????<enumerate>元素用于為用戶自動(dòng)產(chǎn)生<choice>元素的描述,它指定了一個(gè)模板,該模板根據(jù)<choice>元素在<menu>元素中的順序,依次應(yīng)用于每個(gè)<choice>。如果<enumerate>中沒(méi)有內(nèi)容,則使用默認(rèn)的模板,列出所有的<choice>。該默認(rèn)的模板取決于解釋器環(huán)境。如果<enumerate>中有內(nèi)容,這些內(nèi)容就是模板的樣式,它可以引用兩個(gè)專有變量,“_prompt”和“_dtmf”,前者表示<choice>元素的提示語(yǔ),后者表示<choice>元素的DTMF序列。如下面的例子:
                  <?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">
                    <menu dtmf="true">
                     <prompt>
                       Welcome home.
                       <enumerate>
                         For <value expr="_prompt"/>, press <value expr="_dtmf"/>.
                       </enumerate>
                     </prompt>
                     <choice next="http://www.sports.example.com/vxml/start.vxml">
                        sports </choice>
                     <choice next="http://www.weather.example.com/intro.vxml">
                        weather </choice>
                     <choice next="http://www.stargazer.example.com/voice/astronews.vxml">
                        Stargazer astrophysics news </choice>
                    </menu>
                  </vxml>
            ????該menu的提示語(yǔ)為:
                  C: Welcome home. For sports, press 1. For weather, press 2. For Stargazer astrophysics news, press 3.
            ????<enumerate>元素可用于<menu>元素中的<promppt>和<catch>元素,也可以用于包含有<option>元素的<field>元素。如果<enumerate>用于其他的地方,平臺(tái)會(huì)拋出error.semantic事件(例如<enumerate>元素中包含有<enumerate>元素)。
            ?
            五、Grammar Generations
            ????每個(gè)選項(xiàng)的文本(choice phrase)都指定了一組要監(jiān)聽(tīng)的詞或短語(yǔ)。一個(gè)選項(xiàng)的文本由直接或間接包含在<menu>元素中的<choice>元素中的元素的PCDATA組成,或由<field>元素中的<option>元素的PCDATA組成。
            ????如果accept的屬性值為“exact”,則用戶必須匹配選項(xiàng)文本中的整個(gè)短語(yǔ),且順序也要相同。
            ????如果accept的屬性值為“approximate”,則用戶可以匹配選項(xiàng)文本中的短語(yǔ)的子短語(yǔ)。例如,對(duì)于響應(yīng)選項(xiàng)文本“Stargazer astrophysics news”,用戶可以說(shuō)“Stargazer”, “astrophysics”, “Stargazer news”, “astrophysics news”等。產(chǎn)生的語(yǔ)法是依賴語(yǔ)語(yǔ)言和平臺(tái)的。
            ????如下面的例子,在不同的選項(xiàng)中分別使用“exact”和“approximate”。
                  <?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">
                    <menu accept="approximate">
                      <choice next="http://www.stargazer.example.com/voice/astronews.vxml">
                         Stargazer Astrophysics News </choice>
                      <choice accept="exact" next="http://www.physicsweekly.com/voice/example.vxml">
                         Physics Weekly </choice>
                      <choice accept="exact" next="http://www.particlephysics.com/voice/example.vxml">
                         Particle Physics Update </choice>
                      <choice next="http://www.astronomytoday.com/voice/example.vxml">
                         Astronomy Today </choice>
                    </menu>
                  </vxml>
            ????由于第一個(gè)選項(xiàng)的accept屬性值為“approximate”,因此要匹配這個(gè)選項(xiàng),用戶可以只說(shuō)出子短語(yǔ);例如“Stargazer”或“Astrophysics News”。然而,由于第二個(gè)和第三個(gè)選項(xiàng)的accept屬性值為“exact”,因此只有說(shuō)出整個(gè)短語(yǔ)“Physics Weekly”和“Particle Physics Update”才能匹配語(yǔ)法。
            ????在下面的例子中,在<choice>元素中使用了PCDATA:
                  <choice accept="exact" next="http://www.stargazer.example.com/voice/astronews.vxml">
                    <audio src="http://www.stargazer.example.com/space.wav">
                       Stargazer <emphasis>astrophysics</emphasis> news
                    </audio>
                  </choice>
            ????該<choice>元素的選項(xiàng)文本由音頻文件播放,如果該音頻文件不能被播放,則會(huì)以語(yǔ)音合成的方式播放“Stargazer Astrophysics News”。該<choice>元素的語(yǔ)法的精確匹配短語(yǔ)“Stargazer astrophysics news”來(lái)自<choice>元素的PCDATA。
            ?
            六、Interpretation Model
            ????<menu>和只包含一個(gè)簡(jiǎn)單的<field>的<form>的工作機(jī)制類似。Menu的事件處理相應(yīng)的對(duì)應(yīng)于<field>的事件處理。<menu>的語(yǔ)法相應(yīng)的對(duì)應(yīng)于<form>的語(yǔ)法。和在<form>中一樣,<menu>中的語(yǔ)法匹配也會(huì)更新數(shù)組application.lastresult$。這些變量在5.1.5節(jié)中由詳細(xì)描述。
            ????一旦進(jìn)入<menu>,它的語(yǔ)法就被自動(dòng)生成并激活,然后播放提示語(yǔ)。當(dāng)用戶的輸入匹配了一個(gè)<choice>控制該<choice>的next, expr, event或eventexpr屬性值跳轉(zhuǎn)。這四個(gè)屬性中,同時(shí)只可以指定一個(gè)。如果指定了一個(gè)event屬性,而該事件的事件處理沒(méi)有讓解釋器退出或把控制跳轉(zhuǎn)到其他dialog,則FIA會(huì)將該<menu>的anonymous field清零,再次執(zhí)行該<menu>。


            第三節(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)控主叫方和被叫方。
            trueBridge 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ě)在元素的屬性里。
            falseBlind 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事件。
            ?


            posted on 2006-09-16 21:42 鐵觀音 閱讀(2473) 評(píng)論(0)  編輯 收藏 引用 所屬分類: VoiceXML2.0規(guī)范
            久久精品国产99国产电影网 | 久久久久久久波多野结衣高潮| 久久精品国产69国产精品亚洲 | 四虎国产精品免费久久5151| 久久大香香蕉国产| 51久久夜色精品国产| 一级做a爰片久久毛片毛片| 伊人久久综合成人网| 人人狠狠综合久久亚洲婷婷| 无码人妻少妇久久中文字幕| 伊人久久精品无码av一区| 久久99精品综合国产首页| 久久人人超碰精品CAOPOREN| 亚洲AV无码久久| 久久99国产一区二区三区| 色综合久久综合中文综合网| 久久综合狠狠综合久久激情 | 一本久久a久久精品亚洲| 成人午夜精品久久久久久久小说| 色综合合久久天天给综看| 无码国内精品久久人妻| 久久精品国产一区二区三区| 日批日出水久久亚洲精品tv| 欧美一区二区精品久久| 中文字幕乱码人妻无码久久| 国产精品无码久久综合网| 久久久一本精品99久久精品66| 性做久久久久久免费观看| 国产AV影片久久久久久| 精品无码久久久久久尤物| 久久婷婷五月综合97色 | 久久亚洲AV成人无码电影| 一级女性全黄久久生活片免费| 国产激情久久久久影院老熟女免费| 久久精品国产久精国产果冻传媒 | 国产成人久久精品一区二区三区| 无码人妻少妇久久中文字幕| 久久精品无码一区二区日韩AV | 亚洲女久久久噜噜噜熟女| 中文字幕久久精品 | 日韩精品久久久肉伦网站|