青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

鐵觀音

C++編程寶典

   ::  ::  ::  ::  :: 管理 ::
  1 隨筆 :: 19 文章 :: 0 評論 :: 0 Trackbacks
第五章??Control flow and scripting
?
第一節(jié) Variables and Expressions ?
?
????VoiceXML變量和ECMAScript變量是完全等同的:它們在同一個變量空間。VoiceXML變量可在<scrpit>元素中使用,就像<scrpit>元素中定義的變量可在VoiceXML中使用一樣。使用<var>元素聲明一個變量和在<scrpit>元素中用var語句聲明的變量效果是等同的。<scrpit>元素可出現(xiàn)在任何<var>元素能夠出現(xiàn)的地方。Form item也可以聲明VoiceXML變量。
????VoiceXML中變量的命名規(guī)則與在ECMAScript中一樣,但是以下劃線“_”開頭或以美元符號"$"結(jié)尾命名的變量被保留用于內(nèi)部使用。VoiceXML變量,包括form item變量,一定不能包含ECMAScript的保留字。在有關(guān)的正確性上必須遵循ECMAScript的規(guī)則。例如,變量名必須是唯一的,且聲明變量一定不能夠包括點(diǎn)號――“var x.y”在ECMAScript中是非法的聲明。如果變量名和命名規(guī)則或ECMAScript規(guī)則沖突,拋出‘error.semantic’事件。
?
一、Declaring Variables
????變量聲明使用<var>元素:
       <var name="home_phone"/>
       <var name="pi" expr="3.14159"/>
       <var name="city" expr="'Sacramento'"/> 
????form item也可以聲明變量:
       <field name="num_tickets">
         <grammar type="application/srgs+xml" src="/grammars/number.grxml"/>
         <prompt>How many tickets do you wish to purchase?</prompt> 
       </field>
????如果已聲明的變量沒有顯式的給定初始值,則該變量的默認(rèn)值為ECMAScript的undefined。不管在VoiceXML中還是在ECMAScript中,變量在使用之前都要聲明。使用沒有聲明的變量會導(dǎo)致一個ECMAScript錯誤,并拋出error.semantic事件。<scrpit>元素中使用var語句聲明的變量可在VoiceXML中使用,就像VoiceXML變量可在<scrpit>元素中使用一樣。
????在form中,變量由<var>元素聲明,那些由form item聲明的變量在FIA進(jìn)入該form item時被初始化。初始化是按照文檔順序進(jì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="test">
           <var name="one" expr="1"/>
           <field name="two" expr="one+1">
              <grammar type="application/srgs+xml" src="/grammars/number.grxml"/>
           </field>
           <var name="three" expr="two+1"/>
           <field name="go_on" type="boolean">
              <prompt>Say yes or no to continue</prompt>
           </field>
        </form>
      </vxml>
????當(dāng)用戶訪問該<form>元素時,該form的初始化首先聲明變量one,并把它的值置為1。然后聲明field變量two,并把它的值置為2。接著聲明變量three,并把它的值置為3。最后FIA進(jìn)入解釋的主循環(huán),從<field>元素go_on開始。
?
二、Variable Scopes
????VoiceXML使用ECMAScript作用域鏈,允許在應(yīng)用的不同層次中聲明變量。例如,在文檔的作用域中聲明的變量在該文檔的任何地方都可以引用。而在<catch>元素中聲明的本地變量只能在該<catch>元素中被引用。為了保護(hù)各個作用域變量的語義,所有的ECMAScript變量都要聲明。使用沒有聲明的變量會導(dǎo)致一個ECMAScript錯誤,并拋出error.semantic事件。
????變量有如下幾個作用域:
session 這是一些只讀的變量,在整個用戶會話期間都是可用的。它們由解釋器環(huán)境聲明并設(shè)置。在VoiceXML文檔中不能再聲明新的session變量。見5.1.4節(jié)。
application 這是一些由<var>元素和<script>元素聲明的變量,且<var>元素和<script>元素都是應(yīng)用根文檔的<vxml>元素的子元素。這些變量在加載應(yīng)用根文檔時被初始化。在應(yīng)用根文檔被加期間,這些變量都是存在的,且在應(yīng)用根文檔和應(yīng)用葉文檔中都可以訪問它們。注意,當(dāng)在應(yīng)用根文檔中執(zhí)行時,document.x和application.x是等價的。
document 這是一些由<var>元素和<script>元素聲明的變量,且該<var>元素和<script>元素都是該文檔的<vxml>元素的子元素。這些變量在加載文檔時被初始化。在文檔被加期間,這些變量都是存在的,且只能在該文檔中訪問它們。除非該文檔是應(yīng)用根文檔,在這種情況下,在應(yīng)用根文檔和應(yīng)用葉文檔中都可以訪問它們。
dialog 每個dialog(<form>元素或<menu>元素)都有一個dialog作用域,當(dāng)用戶訪問該dialog時,該作用域才存在。Dialog變量是由<var>元素和<script>元素聲明的變量,且該<var>元素和<script>元素都是<form>元素或<menu>元素的子元素;Dialog變量也可以是由各種form item聲明的變量。<form>元素的<var>子元素和<script>子元素在該<form>元素被首次訪問時初始化。<var>元素里面的可執(zhí)行內(nèi)容在執(zhí)行可執(zhí)行內(nèi)容時被初始化。Form item變量在該form item被選定時初始化。
(anonymous) 每個<block>元素,<filled>元素,和<catch>元素定義了一個新的anonymous作用域。在這些元素中聲明的變量的作用域即為anonymous 。它們只能在相應(yīng)的<block>元素,<filled>元素,或<catch>元素中被引用。
表39:變量的作用域
????下面的圖表就是作用域?qū)哟危?/td>
圖11: 作用域?qū)哟?/td>
????在上面的圖中,彎曲的箭頭表示每個作用域都包含了一個和該作用域名稱一樣的預(yù)定義的變量,該變量引用的是作用域本身。例如,在anonymous, dialog, 和document作用域內(nèi)可以使用document.x引用該文檔中作用域?yàn)閐ocument的變量x。另外一個例子,例如,<field>元素的變量作用域?yàn)閍nonymous,它只能在該<field>元素中使用,它上一級的變量作用域?yàn)樵?lt;field>元素所在的<form>元素內(nèi),即dialog。
????我們不推薦使用“session”,“application”,“document”和 “dialog”作為變量名或form item名。雖然它們不是保留字,但是由于VoiveXML使用的是ECMAScript的作用域規(guī)則,使用這些詞作為變量名的話,會覆蓋同名的預(yù)定義變量。
?
三、Referencing Variables
????變量可以在屬性cond和expr中使用:
       <if cond="city == 'LA'">
         <assign name="city" expr="'Los Angeles'"/>
       <elseif cond="city == 'Philly'"/>
         <assign name="city" expr="'Philadelphia'"/>
       <elseif cond="city =='Constantinople'"/>
         <assign name="city" expr="'Istanbul'"/>
       </if>
										
       <assign name="var1" expr="var1 + 1"/>
										
       <if cond="i > 1">
         <assign name="i" expr="i-1"/>
       </if>
????在屬性cond和expr中使用的表達(dá)式的語言正是ECMAScript。注意,屬性cond中的操作符“<”,“<=”和“&&”必須使用XML的轉(zhuǎn)義字符(如“<”,等等)。
????根據(jù)上述的變量作用域鏈,變量引用將匹配離其最近的包含它的作用域。你可以為變量引用加上前綴,前綴名即為作用域名,這樣變量引用將變得很明確。例如,保存一個field item變量為document變量,以被以后使用:
       <assign name="document.ssn" expr="dialog.ssn"/>
????如果應(yīng)用根文檔有一個變量x,則它可在非根文檔中使用application.x引用該變量,而在該應(yīng)用根文檔中則可使用application.x或document.x引用該變量。如果該文檔有一個變量x,且沒有指定屬性application,則在該文檔中可使用application.x或document.x引用該變量。
?
四、Standard Session Variables
????session.connection.local.uri
????該變量的值是一個執(zhí)行本地解釋器環(huán)境設(shè)備的URI。
????session.connection.remote.uri
????該變量的值是一個指向遠(yuǎn)程主叫設(shè)備的URI。
????session.connection.protocol.name
????該變量的值為連接協(xié)議的名稱,也可以通過該名稱的子對象名獲得該協(xié)議中特定的信息。例如,如果鏈接協(xié)議名為“q931”,則session.connection.protocol.q931.uui可能指定了該連接的user-to-user information的屬性值。
????session.connection.protocol.version
????該變量的值為連接協(xié)議的版本號。
????session.connection.redirect
????該變量是一個數(shù)組,內(nèi)含連接重定向的路徑。第一個元素是原來的被叫號碼,最后一個元素是最后重定向的號碼。該數(shù)組中的每個元素都包含了URI,pi(presentation information), si(screening information)和reason屬性。Reason的屬性值可以是“unknown”,“user busy”,“no reply”,“deflection during alerting”,“deflection immediate response”,“mobile subscriber not reachable”。
????session.connection.aai
????該變量的值為連接建立時傳遞的application-to-application information信息。
????session.connection.originator
????該變量的值為該連接的local或remote屬性值,例如,如果是remote部分初始化該連接,則下面的ECMAScript將返回true:var caller_initiate = connection.originator == connection.remote。
?
五、Standard Application Variables
????application.lastresult$
????該變量保存了該應(yīng)用中最后一次識別的信息。它是一個數(shù)組,每個元素通過下面的變量表示一個可能的結(jié)果:
??????application.lastresult$[i].confidence
????該變量表示,這次解釋中整個utterance的confidence級別。取值的范圍為0.0-1.0。0.0表示最低的condence,1.0表示最高的confidence。對confidence的值的解釋是依賴于平臺的。
????application.lastresult$[i].utterance
????該變量表示,這次解釋被識別的詞的原始字符串。確切的標(biāo)記和拼寫是依賴于平臺的(如“five hundred thirty”或者“5 hundred 30”或者“530”)。在DTMF的情況下,該變量包含的是匹配的數(shù)字的字符串。
????application.lastresult$[i].inputmode
????該變量表示,在這次解釋中用戶使用的輸入方式,值為dtmf或voice。
????application.lastresult$[i].interpretation
????該ECMAScript變量包含了這次識別的語義解釋,如3.1.5節(jié)中描述的。
????語義的解釋根據(jù)confidence的分?jǐn)?shù)由高到低排序,若confidence的分?jǐn)?shù)一樣,則根據(jù)產(chǎn)生該解釋的語法中的優(yōu)先權(quán)(見3.1.4節(jié))進(jìn)一步排序。在變量application.lastresult$中,不同元素的utterance和interpretation一般都不一樣,或者兩者都不一樣。
????變量application.lastresult$中元素的數(shù)量總是大于或等于1,且小于或等于系統(tǒng)的“maxnbest” property值。如果系統(tǒng)沒有產(chǎn)生任何結(jié)果,則“application.lastresult$”的值應(yīng)該為ECMAScript的undefined。
????另外,直接引用application.lastresult$的屬性confidence, utterance, inputmode, 和 interpretation等價于引用該數(shù)組中第一個元素的屬性(如application.lastresult$.confidence = application.lastresult$[0].confidence)。
????上述的影子變量在每次識別后馬上被賦值,在這種情況下,<nomatch>事件也是作為識別的結(jié)果的,且它會導(dǎo)致application.lastresult$被賦值,即使<nomatch>事件沒有影響到原有的field變量的值。相反,<noinput>事件不會改變application.lastresult$的值。一旦application.lastresult$被賦值后,它的值會一直保持不變(除非被該應(yīng)用更改了),直到瀏覽器進(jìn)入下一次的等待狀態(tài)才被置為undefined。類似于加載應(yīng)用根文檔時,變量被置為undefined一樣。變量application.lastresult$和它的屬性都是可寫的,可被應(yīng)用更改。
????下面的例子表明了,怎樣在field級別的<catch>元素中使用application.lastresult$變量訪問<link>元素中的語法的識別結(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">
        <link event="menulinkevent">
           <grammar src="/grammars/linkgrammar.grxml" type="application/srgs+xml"/>
        </link>
										
        <form>
           <field>
             <prompt> Say something </prompt>
             <catch event="menulinkevent">
               <if cond="application.lastresult$.confidence < 0.7">
                 <goto nextitem="confirmlinkdialog"/>
               <else/>
                 <goto next="./main_menu.aspl"/>
               </if>
             </catch>
           </field>
        </form>
      </vxml>
????下面的例子表明了,在<script>元素中怎樣遍歷application.lastresult$數(shù)組:
      <?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="color">
           <prompt> Say a color </prompt>
           <grammar type="application/srgs+xml" src="color.grxml" />
           <filled>
           <var name="confident_count" expr="0"/>
             <script>
             <![CDATA[>
            // number of results
               var len = application.lastresult$.length;
										
               // iterate through array
               for (var i = 0; i < len; i++) {
                // check if DTMF
                 if (application.lastresult$[i].confidence > .7) {
                   confident_count++;
                 }
               }
              ]]>
             </script>
             <if cond="confident_count > 1">
               <goto next="#verify"/>
             </if>
           </filled>
          </field>
        </form>
      </vxml>
?
第二節(jié) Event Handling ?
?
????當(dāng)用戶沒有響應(yīng),或沒有清楚的響應(yīng)或請求幫助等,平臺會拋出事件。如果發(fā)現(xiàn)VoiceXML文檔中有語義錯誤時,或執(zhí)行了<throw>元素時,解釋器會拋出事件。事件由字符串表示。
????每個可能發(fā)生事件的元素都可以有以下一組<catch>元素。
??????·<catch>
??????·<error>
??????·<help>
??????·<noinput>
??????·<nomatch>
????如果需要的話,元素會從他的上層元素繼承<catch>元素(“as if by copy”)。例如,<field>元素中沒有包含一個<nomatch>元素,但是包含它的<form>元素有,則使用該<form>元素中的<nomatch>元素。這樣,可以在任何層次指定公共的事件處理,該事件處理在該層次所包含的所有元素中都可以使用。
????“as if by copy”這句話表明,<catch>元素的繼承是指,當(dāng)執(zhí)行該<catch>元素時,變量解析和拋出的事件的處理是在事件被拋出的相關(guān)作用域內(nèi)進(jìn)行的,而不是在包含<catch>元素的作用域內(nèi)。例如,考慮一下這種情況,在document的作用域內(nèi)定義一個<catch>元素,該<catch>元素處理一個該文檔的<field>元素中產(chǎn)生的事件。在這種情況下,<catch>元素中的變量引用是相對于該<field>的作用域解析的。如果<catch>元素捕獲該<field>元素中的一個事件,也是相對于該<field>的作用域進(jìn)行處理的。同樣的,<catch>元素中相對URI的引用也是相對于激活的文檔解析的,而不是相對于包含該<catch>元素的文檔。最后,對property的解析也是相對于產(chǎn)生事件的那個元素。例如,document級的<catch>元素中的<prompt>元素如果沒有指定timeout屬性的話,將使用離事件產(chǎn)生的地方最近的一層的timeout屬性值。
?
一、Throw
????<throw>元素用于拋出一個事件。可以拋出預(yù)定義的事件:
       <throw event="nomatch"/>
       <throw event="connection.disconnect.hangup"/>
????也可以拋出應(yīng)用定義的事件。
       <throw event="com.att.portal.machine"/
????<throw>元素的屬性有:
event 要拋出的事件。
eventexpr ECMAScript表達(dá)式,它的結(jié)果值為要拋出的事件。
message 有關(guān)被拋出的事件的信息。對于拋出的預(yù)定義的事件,該message的值是依賴于平臺的。在<catch>元素中,可通過“_message”變量取得該信息,見5.2.2節(jié)。
messageexpr ECMAScript表達(dá)式。其結(jié)果值為有關(guān)被拋出的事件的信息。
表40:<throw>元素的屬性
????必須正確的指定屬性“event”,“eventexpr”或 “namelist”中的一個,否則會拋出一個error.badfetch事件。可以正確的指定屬性“message”或“messageexpr”中的一個,否則會拋出一個error.badfetch事件。
????除非顯式的規(guī)定,否則VoiceXML不會指定事件何時會被拋出。
?
二、Catch
????<catch>元素將文檔、對話、Form Item與事件捕獲聯(lián)系起來,它包含了可執(zhí)行的內(nèi)容。
      <?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="launch_missiles">
           <field name="user_id" type="digits">
              <prompt>What is your username</prompt>
           </field>
           <field name="password">
              <prompt>What is the code word?</prompt>
              <grammar version="1.0" root="root">
                <rule id="root" scope="public">rutabaga</rule>
              </grammar>
              <help>It is the name of an obscure vegetable.</help>
              <catch event="nomatch noinput" count="3">
                <prompt>Security violation!/prompt>
                <submit next="http://www.example.com/apprehend_felon.vxml" 
                        namelist="user_id"/>
              </catch>
           </field>
        </form>
      </vxml>
????<catch>元素的匿名變量包括一個專有的變量“_event”,它保存了被捕獲的事件名。例如,下面的<catch>元素可以處理兩種事件:
      <catch event="event.foo event.bar">
        <if cond="_event=='event.foo'">
           <!-- Play this for event.foo events -->
           <audio src="foo.wav"/>
         <else/>
           <!-- Play this for event.bar events -->
           <audio src="bar.wav"/>
         </if>
         <!-- Continue with common handling for either event -->
      </catch>
????上面的“_event”變量的作用是根據(jù)被捕獲的事件檢查該播放哪個音頻。如果event.foo事件被捕獲,就播放foo.wav;如果event.bar事件被捕獲,就播放bar.wav。<catch>元素包含的剩下的可執(zhí)行內(nèi)容對兩類事件的處理都是一樣的。
????<catch>元素的匿名變量也包括專有變量“_mesage”,它保存了來自相應(yīng)的<throw>元素的message字符串的值,或者平臺為預(yù)定義事件產(chǎn)生的依賴于平臺的值。如果被拋出的事件沒有指定message,則該“_message”的值為ECMAScript 的undefined。
????如果<catch>元素包含了一個<throw>,且<catch>要捕獲的事件和<throw>元素拋出的事件一樣的話,會形成一個無限循環(huán):
      <catch event="help">
        <throw event="help"/>
      </catch>
????平臺要能夠檢測到這種情況,并拋出一個語義錯誤。
????<catch>元素的屬性:
event 要捕捉的一個或多個事件。可以指定多個事件的列表,事件之間用空格隔開。這樣表示該<catch>元素將捕捉列表中所有的事件。在這種情況下,每個事件有一個單獨(dú)的計(jì)數(shù)器。如果沒有指定該屬性,則表示所有的事件都會被捕捉。
count 表示事件發(fā)生的次數(shù)(默認(rèn)為1)。該屬性可以讓你對同一事件發(fā)生的不同次數(shù)進(jìn)行不同的處理。
每個<form>,<menu>和form item對發(fā)生的每個事件都有一個事件計(jì)數(shù)器。Item級別的事件計(jì)數(shù)器用于在訪問該form item和執(zhí)行該form item的<filled>元素時拋出的事件。Form級別和menu級別的事件計(jì)數(shù)器用于在初始化該dialog和執(zhí)行form級別的<filled>元素時拋出的事件。
當(dāng)<menu>元素和<form>元素被重新進(jìn)入時,該form級別或menu級別的事件計(jì)數(shù)器被重置。<clear>元素不會重置該form級別或menu級別的事件計(jì)數(shù)器。
每當(dāng)<form>元素被重新進(jìn)入時,該<form>元素所包含的item的item級別的事件計(jì)數(shù)器被重置。當(dāng)item被<clear>元素重置時,該item的事件計(jì)數(shù)器也被重置。如果沒有離開該form,且該item被重新進(jìn)入時,該item的事件計(jì)數(shù)器不會被重置。
事件計(jì)數(shù)器增加時,它的全名和匹配該事件的各個前綴都會增加。例如,事件“event.foo.1”的發(fā)生使“event.foo.1” 、“event.foo”和“event”的事件計(jì)數(shù)器都增加1。
cond ECMAScript表達(dá)式。只有當(dāng)其結(jié)果值為 boolean true,才執(zhí)行該元素。缺省時為 true。
表41:<catch>元素的屬性
?
三、快捷標(biāo)記
????<error>、<help>、<noinput>和<nomatch>元素都是<catch>元素特定形式的快捷標(biāo)記。
????<error>元素是<catch event="error">的快捷標(biāo)記,他用于捕獲所有類型的error事件:
       <error>
         An error has occurred -- please call again later.
         <exit/>
       </error>
????<help>元素是<catch event="help">的快捷標(biāo)記。
       <help>No help is available.</help>
????<noinput>元素是<catch event="noinput">的快捷標(biāo)記
       <noinput>I didn't hear anything, please try again.</noinput>
????< nomatch>元素是<catch event=" nomatch ">的快捷標(biāo)記
       <nomatch>I heard something, but it wasn't a known city.</nomatch>
????這些元素都有如下屬性:
count 要捕獲的事件發(fā)生的次數(shù)(和<catch>元素中的count屬性一樣)。
cond 一個表達(dá)式,用于測試該元素是否捕捉該事件(和<catch>元素中的cond屬性一樣),默認(rèn)為true。
表42:<catch>元素的快捷標(biāo)記的屬性
?
四、Catch Element Selection
????一個元素如果需要的話,將從它的每個上層元素繼承(“as if by copy”)<catch>元素。例如,如果<field>元素從文檔繼承<catch>元素
      <?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">
        <catch event="event.foo">
           <audio src="beep.wav"/>
        </catch>
										
       <form>
           <field name="color">
              <prompt>Please say a primary color</prompt>
           <grammar type="application/srgs">red | yellow | blue</grammar>
              <nomatch>
                <throw event="event.foo"/>
              </nomatch>
           </field>
        </form>
      </vxml>
????則該<catch>元素被隱式的拷貝到該<field>元素中,如下:
      <?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>
              <prompt>Please say a primary color</prompt>
           <grammar type="application/srgs">red | yellow | blue</grammar>
              <nomatch>
                <throw event="event.foo"/>
              </nomatch>
              <catch event="event.foo">
                <audio src="beep.wav"/>
              </catch>
           </field>
        </form>
      </vxml>
????當(dāng)拋出一個事件時,則檢查該事件被處理的作用域及包含該作用域的所有作用域,根據(jù)以下的算法以確定最合適的<catch>元素:
??????1、將當(dāng)前作用域內(nèi)和包含該作用域的所有作用域內(nèi)的所有的<catch>元素形成一個列表,先以作用域排序(由當(dāng)前作用域開始),在每個作用域內(nèi)再以文檔順序排序。
??????2、去掉該列表中于當(dāng)前拋出的事件不匹配的元素;去掉cond屬性值為boolean false的元素。
??????3、找出"正確的計(jì)數(shù)":在該列表的<catch>元素中count屬性值最高的,且小于或等于當(dāng)前的count值的<catch>元素。
??????4、選定該列表中計(jì)數(shù)正確的第一個<catch>元素。
????如果拋出的事件名匹配了<catch>元素中的事件名,則這是一個精確匹配,或是前綴匹配,或者該<catch>元素沒有指定event屬性。如果<catch>元素event屬性值中的事件是所拋出的事件的前綴,則為前綴匹配。點(diǎn)號是前綴的分隔符,點(diǎn)號后面的字符都去掉。空的字符串可以匹配任何事件。例如:
       <catch event="connection.disconnect">
         <prompt>Caught a connection dot disconnect event</prompt>
       </catch>
????在該例子中,事件connection.disconnect前綴匹配事件connection.disconnect.transfer。
       <catch event="com.example.myevent">
         <prompt>Caught a com dot example dot my event</prompt>
       </catch>
????上面的例子中,事件com.example.myevent將前綴匹配事件com.example.myevent.event1., com.example.myevent. 和 com.example.myevent.event1,而事件com.example.myevents.event1則不會被匹配。
       <catch event=".">
         <prompt>Caught an event</prompt>
       </catch>
????上面的例子中,點(diǎn)號將前綴匹配所有的事件(如同<catch>元素沒有指定event屬性一樣)。
????注意,在<catch>元素的選定算法中,文檔順序靠前的<catch>元素的優(yōu)先權(quán)比文檔順序靠后的高。該算法并沒有規(guī)定,指定的事件越明確的<catch>元素的優(yōu)先權(quán)越高。因此在一般情況下,我們建議,指定的事件越明確的<catch>元素,其文檔順序應(yīng)越靠前;而越不明確的<catch>元素,其文檔順序應(yīng)越靠后。例如,我們建議捕捉事件“error.foo”和“error”的文檔順序如下:
       <catch event="error.foo">
         <prompt>Caught an error dot foo event</prompt>
       </catch>
       <catch event="error">
         <prompt>Caught an error event</prompt>
       </catch>
????如果上述的<catch>元素的文檔順序相反,則捕捉事件“error.foo”的<catch>元素永遠(yuǎn)都不會被執(zhí)行。
?
五、Default Catch Elements
????如果開發(fā)者沒有指定對noinput,help,nomatch,cancel,exit和error這幾個事件的事件處理,解釋器應(yīng)該隱式的提供這些事件默認(rèn)的事件處理。
????系統(tǒng)對各種事件和錯誤默認(rèn)的事件處理可總結(jié)為以下兩點(diǎn):1、是否提供音頻作為響應(yīng);2、執(zhí)行什么操作。如果提供音頻作為響應(yīng),收集播放的內(nèi)容是依賴于平臺的。
事件類型 是否提供音頻 執(zhí)行的操作
cancel 沒有reprompt
error 退出解釋器
exit 退出解釋器
help reprompt
noinput reprompt
nomatch reprompt
maxspeechtimeout reprompt
connection.disconnect 退出解釋器
all others 退出解釋器
表43:默認(rèn)的<catch>元素的事件處理
????不同的平臺可能有不同的默認(rèn)提示語。
?
六、Event Types
????事件可分為預(yù)定義事件、應(yīng)用和平臺指定的事件,還可分為普通事件(正常情況下發(fā)生的事件)和錯誤事件(非正常情況下發(fā)生的事件)。錯誤事件的命名規(guī)則允許使用多級命名。
????瀏覽器可以拋出一個預(yù)定義事件的擴(kuò)展事件,該擴(kuò)展事件是以指定的預(yù)定義事件名作為前綴的。處理預(yù)定義事件的應(yīng)用是可以共用的,而處理擴(kuò)展的預(yù)定義事件的應(yīng)用則不能保證它的共用性。例如,如果在加載一個語法文件時檢測到一個語法錯誤,則平臺必須拋出“error.badfetch”事件,如果拋出“error.badfetch.grammar.syntax”也是可接受的。
????關(guān)于事件的更多的信息,可通過“_message”變量獲得(見5.2.2節(jié))。
????預(yù)定義的事件有:
????cancel
????用戶要求取消播放當(dāng)前提示語。
????connection.disconnect.hangup
????用戶掛機(jī)。
????connection.disconnect.transfer
????用戶被無條件轉(zhuǎn)接到另一條線路,且不會返回。
????exit
????用戶要求退出。
????help
????用戶請求幫助。
????noinput
????用戶在timeout的時間內(nèi)沒有響應(yīng)。
????nomatch
????用戶有輸入,但是和語法不匹配。
????maxspeechtimeout
????用戶輸入的事件超過了‘maxspeechtimeout’ property的值。
????另外,還有在跳轉(zhuǎn)中產(chǎn)生的錯誤(見2.4.7.3節(jié)),預(yù)定義的錯誤有:
????error.badfetch
????當(dāng)解釋器環(huán)境已經(jīng)解釋到某個文檔中需要獲取一個文檔的地方,且獲取該文檔失敗,則解釋器環(huán)境會拋出該事件。不支持的scheme應(yīng)用,不對的URI,客戶端退出,信息傳送錯誤,timeout,安全違規(guī),不支持的資源類型,資源類型不匹配,文檔解析錯誤和scheme指定的各種錯誤代碼的返回都會導(dǎo)致獲取失敗。
????如果解釋器環(huán)境根據(jù)環(huán)境預(yù)取了一個文檔,但是后來并不需要這個文檔,則不會拋出error.badfetch事件。類似的,如果獲取一個音頻文件失敗,但是該音頻有候補(bǔ)的音頻或有候補(bǔ)的文本,且獲取候補(bǔ)的音頻或文本成功,則不會拋出error.badfetch事件。
????當(dāng)解釋器環(huán)境將要跳轉(zhuǎn)到一個新的文檔時,一直準(zhǔn)備拋出error.badfetch事件,直到它能夠執(zhí)行這個新的文檔為止。但是,如果拋出事件,也只是在需要該新文檔的時候才拋出。在需要該新文檔之前是不會拋出的。執(zhí)行這個新文檔是否包括變量初始化是依賴于平臺的。
????error.badfetch.http.<response code>
????error.badfetch.protocol.<response code>
????當(dāng)獲取失敗時,解釋器環(huán)境必須用一個具體的事件類型表明是遇到了哪一個特定的HTTP或其他的協(xié)議的響應(yīng)碼(response code),RFC2616中定義了HTTP響應(yīng)碼的值。這樣對于一個獲取失敗的文檔,應(yīng)用就可以進(jìn)行不同的處理。其他協(xié)議的響應(yīng)碼的值是依賴于相應(yīng)的協(xié)議的。
????error.semantic
????當(dāng)在VoiceXML文檔中發(fā)現(xiàn)運(yùn)行時(run-time)錯誤時,拋出該事件。例如取子串越界錯誤,或引用undefined的變量。
????error.noauthorization
????當(dāng)應(yīng)用試圖執(zhí)行一個平臺沒有授權(quán)的操作時,拋出這個事件。例如,呼叫一個非法的電話號碼,或呼叫該用戶不允許呼叫的號碼,或通過依賴于平臺的object訪問受保護(hù)的數(shù)據(jù)庫,或不適當(dāng)?shù)倪M(jìn)入內(nèi)置語法等。
????error.noresource
????這是一個運(yùn)行時錯誤。在執(zhí)行期間,如果請求的平臺資源不可用時,拋出這個事件。
????error.unsupported.builtin
????當(dāng)平臺不支持所請求的內(nèi)置類型/語法時,拋出這個事件。
????error.unsupported.format
????當(dāng)平臺不支持所請求的資源的格式時,拋出這個事件。例如一個不支持的語法格式,或媒體格式。
????error.unsupported.language
????當(dāng)平臺不支持語音合成或語音識別的語言時,拋出這個事件。
????error.unsupported.element
????當(dāng)平臺不支持給定的元素(該元素是這個技術(shù)規(guī)范中定義的VoiceXML元素)時,拋出這個事件。例如,如果平臺沒有實(shí)現(xiàn)<transfer>元素,在使用該元素時,必須拋出error.unsupported.transfer事件。這樣可以讓開發(fā)者使用事件處理來適應(yīng)不同的平臺。
????在加載文檔時碰到的錯誤,包括傳送錯誤(沒有找到文檔、HTTP狀態(tài)碼404等等)和句法錯誤(沒有<vxml>元素等),會導(dǎo)致在調(diào)用的文檔中拋出一個error.badfetch事件。在加載文檔之后,進(jìn)入FIA的初始化階段之前出現(xiàn)的錯誤按照平臺指定的方式進(jìn)行處理。進(jìn)入FIA的初始化階段之后出現(xiàn)的錯誤,在新文檔中拋出相應(yīng)的事件,例如語義錯誤等。在加載會話的第一個文檔時出現(xiàn)的錯誤的處理方式是依賴于平臺的。
????依賴于應(yīng)用和依賴于平臺的事件類型應(yīng)該使用反轉(zhuǎn)域名的命名規(guī)則,以避免命名沖突。例如:
????error.com.example.voiceplatform.noauth
????表示用戶在該平臺上無權(quán)呼出。
????org.example.voice.someapplication.toomanynoinputs
????表示用戶沒有輸入的時間太長了。
????<catch>元素能捕捉特定的事件(cancel),或那些前綴(error.unsupported)相同的事件。

第三節(jié) Executable Content ?
?
????可執(zhí)行內(nèi)容指的是一段程序邏輯。例如出現(xiàn)在
??????·form item <block>元素中;
??????·<form>元素或input item的<filled>元素中;
??????·事件處理中(<catch>,<help>元素等)。
????可執(zhí)行元素按照它們的文檔順序被依次執(zhí)行。如果某個可執(zhí)行元素產(chǎn)生一個錯誤,則這個錯誤馬上被拋出。其后的可執(zhí)行元素就不會被執(zhí)行了。
????這一節(jié)描述的是出現(xiàn)在可執(zhí)行內(nèi)容中的元素。
?
一、VAR
????<var>元素用于聲明一個變量。它可以出現(xiàn)在任何可執(zhí)行的內(nèi)容中,也可以作為<form>元素或<vxml>元素的子元素出現(xiàn)。例如:
       <var name="phone" expr="'6305551212'"/>
       <var name="y" expr="document.z+1"/>
????如果它出現(xiàn)在可執(zhí)行的內(nèi)容中,它聲明的變量作用域?yàn)閍nonynous,且作用在包含它的<block>,<filled>或<catch>元素中。在這種情況下,只有<var>元素被執(zhí)行的時候才聲明該變量。如果該變量在這個作用域已經(jīng)聲明了,則其后的聲明將被看作是賦值,就像在ECMAScript中一樣。
????如果<var>元素作為<form>元素的子元素出現(xiàn),則它聲明的變量的作用域?yàn)樵揻orm的dialog。在這種情況下,在該form的初始化階段就進(jìn)行變量聲明(詳見2.1.6.1節(jié))。<var>元素不是一個form item,因此,它不能被FIA的主循環(huán)訪問。
????如果<var>元素作為<vxml>元素的子元素出現(xiàn),它聲明的變量的作用域?yàn)閐ocument;如果該文檔是應(yīng)用根文檔,它聲明的變量的作用域?yàn)閍pplication。當(dāng)文檔被初始化的時候就進(jìn)行變量聲明,且初始化是按照文檔的順序進(jìn)行的。
????它的屬性有:
name 保存變量值的變量名。
expr 該變量的初始值(可選的)。如果沒有指定該屬性,該變量保持它當(dāng)前的值(如果它當(dāng)前有值的話);如果沒有給定初始值,變量初始值默認(rèn)為ECMAScript的undefined。
表44:<var>元素的屬性
?
二、ASSIGN
????<assign>元素用來給變量賦值:
      <assign name="flavor" expr="'chocolate'"/>
      <assign name="document.mycost" expr="document.mycost+14"/>
????給沒有用<var>元素或在<script>元素中的var語句顯式聲明的變量賦值是非法的。試圖給一個沒有聲明的變量賦值,平臺會拋出error.semantic事件。
????注意:如果一個ECMAScript對象已經(jīng)被正確地初始化(例如“obj”),則它的屬性(例如“obj.prop1”)沒有顯式聲明就可以給它賦值(實(shí)際上,如果試圖聲明ECMAScript對象的屬性,如聲明“obj.prop1”平臺會拋出error.semantic事件)。
????<assign>元素的屬性:
name 要被賦值的變量名。
expr 要賦給該變量的值。
表45:<assign>元素的屬性
?
三、CLEAR
????<clear>元素的作用是重置(清零)一個或多個變量,包括form item。重置form item包括以下的操作:
??????1、把該form item變量置為ECMAScript的undefined。
??????2、重新初始化該form item的提示語計(jì)數(shù)器和事件計(jì)數(shù)器。
????例如:
       <clear namelist="city state zip"/>
????它的屬性有:
namelist 要重置的變量清單,它除了可以包括form item也可以包括變量名。如果沒有指定,當(dāng)前form的所有form item都被重置。
表46:<clear>元素的屬性
?
四、IF, ELSEIF, and ELSE
????<if>元素用于判斷條件邏輯,它可以和<elseif>、<else>搭配使用。
      <if cond="total > 1000">
         <prompt>This is way too much to spend.</prompt>
      </if>
										
     <if cond="amount < 29.95">
        <assign name="x" expr="amount"/>
     <else/>
        <assign name="x" expr="29.95"/>
      </if>
										
      <if cond="flavor == 'vanilla'">
        <assign name="flavor_code" expr="'v'"/>
      <elseif cond="flavor == 'chocolate'"/>
        <assign name="flavor_code" expr="'h'"/>
      <elseif cond="flavor == 'strawberry'"/>
        <assign name="flavor_code" expr="'b'"/>
      <else/>
        <assign name="flavor_code" expr="'?'"/>
      </if>
?
五、PROMPT
????提示語可以<prompt>元素的一般形式出現(xiàn)在可執(zhí)行內(nèi)容中,除非不使用<prompt>元素的count屬性。特別的,它的cond屬性也可用在可執(zhí)行內(nèi)容中。提示語可以被封裝在<prompt>和</prompt>中,或使用PCDATA表示。只要是<prompt>元素允許出現(xiàn)的地方,使用PCDATA xyz等價于使用<prompt>xyz</prompt>。
      <nomatch count="1">
         To open the pod bay door, say your code phrase clearly. 
      </nomatch>
										
     <nomatch count="2">
        <prompt>
           This is your <emphasis>last</emphasis> chance.
       </prompt>
     </nomatch>
										
      <nomatch count="3">
         Entrance denied.
        <exit/>
     </nomatch>
?
六、REPROMPT
????在處理一個事件的過程中,F(xiàn)IA需要一個<catch>元素對適當(dāng)?shù)奶崾菊Z進(jìn)行排隊(duì)。因此,在執(zhí)行完一個<catch>元素后的下一次循環(huán)中,F(xiàn)IA一般不會進(jìn)行正常的選定和提示語排隊(duì)。然而,有兩種情況下,F(xiàn)IA在執(zhí)行完一個<catch>元素后的下一次循環(huán)中,會進(jìn)行正常的選定和提示語排隊(duì):
??????1、如果在<catch>元素中執(zhí)行了<goto>元素或<submit>元素,跳轉(zhuǎn)到另一個dialog,或者執(zhí)行了一個<return>元素,從一個subdialog中返回,在這些情況下,新的dialog需要保證它的初始提示語保持原樣;
??????2、如果在<catch>元素中執(zhí)行了一個<reprompt>元素,要求FIA隨后要重新播放提示語。
????在這兩種情況中,F(xiàn)IA選定下一個要訪問的form item之后,會執(zhí)行正常的提示語處理,包括選定該form item的提示語,對提示語進(jìn)行排隊(duì),和給該form item的提示語計(jì)數(shù)器加1。
????例如,下面的例子中的noinput事件處理希望FIA訪問下一個form item時,選定并播放它的提示語:
      <field name="want_ice_cream">
        <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
        <prompt>Do you want ice cream for dessert?</prompt>
        <prompt count="2">
          If you want ice cream, say yes.
          If you do not want ice cream, say no.
       </prompt>
       <noinput>
          I could not hear you.
          <!-- Cause the next prompt to be selected and played. -->
         <reprompt/>
       </noinput>
     </field>
????可能的一個對話流程:
      C: Do you want ice cream for dessert?
      H: (silence) 
      C: I could not hear you.
      C: If you want ice cream, say yes. If you don't want ice cream, say no.
      H: (silence) 
      C: I could not hear you.
      C: If you want ice cream, say yes. If you don't want ice cream, say no.
      H: No.
????如果該例子中沒有<reprompt>元素,上面的流程變?yōu)槿缦滤荆?/td>
      C: Do you want ice cream for dessert?
      H: (silence) 
      C: I could not hear you.
      H: (silence) 
      C: I could not hear you.
      H: No.
????注意,上面的例子中之所以略過了提示語選擇階段,是因?yàn)樵趫?zhí)行完一個<catch>元素后(沒有執(zhí)行<reprompt>元素,或沒有通過<goto>、<submit>、<return>元素跳轉(zhuǎn)到另一個dialog),被FIA選定的該form item的提示語計(jì)數(shù)器并沒有加1。
????同時注意,執(zhí)行一個<catch>元素后(沒有執(zhí)行<reprompt>元素,或沒有通過<goto>、<submit>、<return>元素跳轉(zhuǎn)到另一個dialog),F(xiàn)IA選定的下一個要訪問的form item的提示語選定階段也會被略過,即使該form item和前一個被選定的form item不是同一個。
????<reprompt>元素在<catch>元素之外是不會起作用的。
?
七、GOTO
????<goto>元素用于:
??????1、跳轉(zhuǎn)到當(dāng)前form的另一個form item;
??????2、跳轉(zhuǎn)到當(dāng)前文檔的另一個dialog;
??????3、跳轉(zhuǎn)到另一個文檔。
????要跳轉(zhuǎn)到另一個form item,使用next屬性,或使用expritem屬性,如果該form item名可以通過ECMAScript表達(dá)式計(jì)算得到的話:
      <goto nextitem="ssn_confirm"/>
      <goto expritem="(type==12)? 'ssn_confirm' : 'reject'"/>
????要跳轉(zhuǎn)到同一個文檔的另一個dialog,使用next屬性,或使用expr屬性指定一個URI段:
      <goto next="#another_dialog"/>
      <goto expr="'#' + 'another_dialog'"/>
????要跳轉(zhuǎn)到另一個文檔使用next屬性,或使用expr屬性指定一個URI:
      <goto next="http://flight.example.com/reserve_seat"/>
      <goto next="./special_lunch#wants_vegan"/>
????URI可以是當(dāng)前文檔的絕對或相對的URI。要指定下一個文檔開始的dialog,可以使用對應(yīng)于該dialog的id屬性值的URI段。如果沒有指定URI段,則以要跳轉(zhuǎn)到的文檔的第一個dialog為開始的dialog。
????注意,跳轉(zhuǎn)到當(dāng)前文檔的另一個dialog會導(dǎo)致舊的dialog變量丟失,即使是一個dialog跳轉(zhuǎn)到它自己也會丟失。同樣的,使用相對或絕對的URI跳轉(zhuǎn)到另一個文檔,也會丟失文檔變量,即使是一個文檔跳轉(zhuǎn)到它自己也會丟失。然而,當(dāng)跳轉(zhuǎn)到一個帶有段標(biāo)識符的空的URI引用時,文檔變量不會丟失。例如下面兩個語句在URI為http://someco.example.com/index.vxml的文檔中有不同的行為:
      <goto next="#foo"/>
										
      <goto next="http://someco.example.com/index.vxml#foo"/>
????根據(jù)RFC2396,段標(biāo)識符(“#”后面的部分)不是URI的一部分,到一個空的URI引用加上段標(biāo)識符的跳轉(zhuǎn)永遠(yuǎn)都不會獲取到一個新的文檔。因此,第一條語句中的“#foo”時一個帶有段標(biāo)識符的空的URI引用,它的文檔變量不會丟失。在第二條語句中,“#foo”是一個絕對URI的一部分,該跳轉(zhuǎn)會導(dǎo)致文檔變量的丟失。如果想要在多文檔中保存數(shù)據(jù),請把數(shù)據(jù)保存在應(yīng)用根文檔中。
????在<goto>元素的next或expr屬性中,URI引用(詳見RFC2396)指定要跳轉(zhuǎn)到的dialog,如果這個URI引用包含一個絕對或相對的URI,該URI可以包含一個查詢串,則FIA獲取該URI,并且在目標(biāo)文檔中尋找相應(yīng)的dialog。
????如果該URI引用只包含一個段(即沒有絕對或相對的URI),則沒有任何文檔被獲取,F(xiàn)IA在當(dāng)前文檔中尋找相應(yīng)的dialog。
????URI引用中的段,如果有的話,以要跳轉(zhuǎn)到的dialog命名,如果URI引用中沒有段,則選定目標(biāo)文檔的第一個dialog。
????如果要跳轉(zhuǎn)到的form item、dialog或文檔不可用(即該form item、dialog或文檔不存在),必須拋出error.badfetch事件。注意,對于在dialog或文檔跳轉(zhuǎn)時出現(xiàn)錯誤,處理錯誤的作用域是依賴于平臺的;對于在form item之間跳轉(zhuǎn)時出現(xiàn)的錯誤,事件在dialog的作用域內(nèi)處理。
????<goto>元素的屬性:
next 要跳轉(zhuǎn)到的URI。
expr 一個ECMAScript表達(dá)式 ,其結(jié)果值為要跳轉(zhuǎn)到的URI。
nextitem 當(dāng)前form 中下一個要訪問的form item名。
expritem 一個 ECMAScript表達(dá)式,其結(jié)果值為當(dāng)前form中下一個要訪問的form item名。
fetchaudio 見6.1節(jié)。它默認(rèn)為fetchaudio <property>。
fetchhint 見6.1節(jié)。它默認(rèn)為documentfetchhint <property>。
fetchtimeout 見6.1節(jié)。它默認(rèn)為fetchtimeout <property>。
maxage 見6.1節(jié)。它默認(rèn)為documentmaxage <property>。
maxstale 見6.1節(jié)。它默認(rèn)為documentmaxstale <property>。
表47:<goto>元素的屬性
????必須正確地指定屬性“next”、“expr”、“event”和“eventexpr”中的一個,否則會拋出error.badfetch事件。
?
八、SUBMIT
????<submit>元素用于提交信息給web服務(wù)器,然后跳轉(zhuǎn)到web服務(wù)器響應(yīng)后返回的文檔。和<goto>元素不一樣的是,<submit>元素可以通過HTTP GET或POST請求提交一個變量列表到文檔服務(wù)器。例如可以提交一組form item變量到服務(wù)器:
      <submit next="log_request" method="post"
         namelist="name rank serial_number"
         fetchtimeout="100s" fetchaudio="audio/brahms2.wav"/>
????<submit>元素的next或expr屬性指定了要跳轉(zhuǎn)到的dialog。該URI每次都要被獲取,即使它只包含了一個段。在URI只包含一個段的情況下,請求的URI就是當(dāng)前文檔的基本URI。因此,下面的兩個元素有完全不同的效果:
      <goto next="#get_pin"/>
										
      <submit next="#get_pin"/>
????注意:雖然URI總是要被獲取,并且跳轉(zhuǎn)到目標(biāo)文檔,但是通過緩存,還是能夠滿足某些<submit>元素請求的。例如,如果web服務(wù)器在響應(yīng)時提供了一個顯式的過期時間,就可能發(fā)生這種情況。
????如果要跳轉(zhuǎn)到的dialog或文檔是非法的(即該dialog或文檔不存在),必須拋出一個error.badfetch事件。注意:對于那些在dialog或文檔跳轉(zhuǎn)時出現(xiàn)的錯誤,在哪個作用域內(nèi)處理它們是依賴于平臺的。
????<submit>元素的屬性有:
next 要引用的URI。
expr ECMAScript表達(dá)式,它的結(jié)果值為要引用的URI。
namelist 要提交的變量名列表。默認(rèn)是提交所有有命名的input item。如果指定了namelist屬性,它可以包含一個或多個變量名,以空格隔開。在VoiceXML和ECMAScript中聲明的變量都能被提交。
method 請求的方法:get(默認(rèn)的)或post。
enctype 被提交的文檔的媒體編碼類型,默認(rèn)為application/x-www-form-urlencoded 。解釋器也必須支持multipart/form-data ,也可以支持其他的編碼類型。
fetchaudio 見6.1節(jié)。它默認(rèn)為fetchaudio <property>。
fetchhint 見6.1節(jié)。它默認(rèn)為documentfetchhint <property>。
fetchtimeout 見6.1節(jié)。它默認(rèn)為fetchtimeout <property>。
maxage 見6.1節(jié)。它默認(rèn)為documentmaxage <property>。
maxstale 見6.1節(jié)。它默認(rèn)為documentmaxstale <property>。
表48:<submit>元素的屬性
????必須正確的指定屬性next或expr中的一個,否則會拋出error.badfetch事件。
????當(dāng)一個ECMAScript變量被提交給服務(wù)器時,它先被轉(zhuǎn)換成一個字符串才被提交。VoiceXML目前還沒有定義一種提交ECMAScript對象的機(jī)制,將來會定義這種機(jī)制。一種變通的方法是,開發(fā)者可以顯式的提交對象的屬性,例如“date.month date.year”。
????如果<submit>元素包含的變量引用了一個錄制的音頻,但是沒有包含multipart/form-data的ENCTYPE的話,VoiceXML目前還沒有規(guī)定這種行為。試圖在URI中對大量的數(shù)據(jù)編碼顯然是不合實(shí)際的。
?
九、EXIT
????<exit>把控制返回給解釋器環(huán)境,由解釋器環(huán)境決定下一步做什么。
      <exit/>
????該元素和<return>元素的不同之處在于它終止了所有加載的文檔,而<return>則是從一個<subdialog>調(diào)用中返回。如果<subdialog>調(diào)用了一個新的文檔(或應(yīng)用),則<return>會終止被調(diào)用的文檔,控制返回到<subdialog>元素繼續(xù)執(zhí)行。
????注意,一旦<exit>把控制返回給解釋器環(huán)境,解釋器環(huán)境就可以做它想做的操作。例如,它可以給用戶播放上一級<menu>元素中的提示語,或者掛機(jī),或者把用戶轉(zhuǎn)接到人工坐席。
????它的屬性有:
expr 一個ECMAScript表達(dá)式,該表達(dá)式的值就是要返回的值(如“0”,“oops!”或“field1”)。
namelist 要返回給解釋器環(huán)境的變量名清單。默認(rèn)是返回0個變量,這樣意味著解釋器環(huán)境將接收到一個空的ECMAScript 對象。
表49:<exit>元素的屬性
????可以正確地指定屬性“expr”和“namelist”中的一個,否則,會拋出error.badfetch事件。
????<exit>元素不會拋出一個“exit”事件。
?
十、RETURN
????<return>元素用于結(jié)束一個subdialog的執(zhí)行,并把控制和數(shù)據(jù)返回給調(diào)用它的dialog。
????它的屬性有:
event 要返回并拋出的事件。
eventexpr ECMAScript表達(dá)式。其結(jié)果值為拋出的事件。它的作用是從subdiaolog中返回,并拋出該事件 。
message 有關(guān)被拋出的事件的信息。在<catch>元素中,可通過“_message”變量取得該信息,見5.2.2節(jié)。
messageexpr ECMAScript表達(dá)式。其結(jié)果值為有關(guān)被拋出的事件的信息。
namelist 要返回的變量名。默認(rèn)為返回0個變量,即調(diào)用該subdialog的dialog將得到一個空的ECMAScript 對象 。
表50:<return>元素的屬性
????可以正確的指定屬性“event”,“eventexpr”或“namelist”中的一個,否則會拋出一個error.badfetch事件。可以正確的指定屬性“message”或“messageexpr”中的一個,否則會拋出一個error.badfetch事件。
????當(dāng)從一個subdialog中返回,一個事件在調(diào)用的地方被拋出,或者數(shù)據(jù)作為一個ECMAScript對象被返回,該對象的屬性對應(yīng)于subdialog中的<return>元素的namelist屬性值。如果不是在subdialog中執(zhí)行,卻碰到<return>元素,則會拋出一個語義錯誤。
????下面的例子展示了,當(dāng)subdialog不能獲得一個可識別的結(jié)果時,一個nomatch事件通過subdialog在調(diào)用它的dialog中拋出。
      <?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>
           <subdialog name="result" src="#getssn">
              <nomatch>
                <!-- a no match event that is returned by the  subdialog indicates
                     that a valid social security number could not be matched. -->
                <goto next="http://myservice.example.com/ssn-problems.vxml"/>
              </nomatch>
										
             <filled>
               <submit namelist="result.ssn"
                  next="http://myservice.example.com/cgi-bin/process"/>
             </filled>
           </subdialog>
         </form>
        <form id="getssn">
          <field name="ssn">
          <grammar src="http://grammarlib/ssn.grxml" type="application/srgs+xml"/>
           <prompt> Please say social security number.</prompt>
           <nomatch count="3">
             <return event="nomatch"/>
           </nomatch>
           <filled>
             <return namelist="ssn"/>
           </filled>
          </field>
        </form>
      </vxml>
????subdialog中的nomatch事件處理在第三次匹配失敗時被觸發(fā),然后從subdialog中返回,并在調(diào)用他的dialog中拋出該事件。在這種情況下,調(diào)用的dialog將執(zhí)行它自己的nomatch事件處理,通過<goto>元素跳轉(zhuǎn)到另一個文檔,而不是執(zhí)行<filled>操作。在一般的情況下,如果得到一個識別結(jié)果,就會執(zhí)行該<subdialog>元素中的<filled>操作,該識別結(jié)果可通過result.ssn訪問。
?
十一、DISCONNECT
????它的作用是使解釋器環(huán)境斷開和用戶之間的鏈接,此時,解釋器環(huán)境將拋出connection.disconnect.hangup事件,它可以被捕獲,以做一些清除的處理。
      <disconnect/>
?
十二、SCRIPT
????<script>元素允許在VoiceXML腳本中使用一段客戶端的腳本語言代碼,它和HTML的<SCRIPT>元素類似。例如下面的例子中<script>元素用于計(jì)算一個數(shù)的階乘:
      <?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">
       <script> <![CDATA[
             function factorial(n)
             {
              return (n <= 1)? 1 : n * factorial(n-1);
             }
        ]]> </script>
										
       <form id="form">
          <field name="fact">
            <nomatch>
             <grammar type="application/srgs+xml" src="/grammars/number.grxml"/>
             <prompt>
                Tell me a number and I'll tell you its factorial.
             </promptd>
             <filled>
               <prompt>
                 <value expr="fact"/> factorial is
                 <value expr="factorial(fact)"/>
               </prompt>
             </filled>
           </field>
         </form>
      </vxml>
????<script>元素可以出現(xiàn)在<vxml>元素和<form>元素中,或者出現(xiàn)在可執(zhí)行的內(nèi)容中(如<filled>,<if>,<block>,<catch>或<catch>元素的快捷標(biāo)記)。在文檔被裝載后,<vxml>元素中的<script>元素和<var>元素都按照它們的文檔順序被依次求值。每次執(zhí)行到<form>元素,該form中的<script>元素和<var>元素及form item 變量也是按照它們的文檔順序被依次求值。和其他的可執(zhí)行元素一樣,當(dāng)在可執(zhí)行的內(nèi)容中碰到<script>元素時,都會執(zhí)行它。
????<script>元素的屬性有:
src 如果腳本是外部的,則該屬性指定了該外部腳本的URI。
charset 屬性src指定的腳本的字符編碼。平臺必須支持ISO/IEC 10646的UTF-8 和 UTF-16編碼,也可以支持其他的編碼,如IANA中定義的。默認(rèn)為UTF-8。
fetchhint 見6.1節(jié)。它默認(rèn)為documentfetchhint <property>。
fetchtimeout 見6.1節(jié)。它默認(rèn)為fetchtimeout <property>。
maxage 見6.1節(jié)。它默認(rèn)為documentmaxage <property>。
maxstale 見6.1節(jié)。它默認(rèn)為documentmaxstale <property>。
表51:<script>元素的屬性
????必須指定一個src屬性或一個聯(lián)機(jī)腳本中的一個(不是兩個都指定),否則,會拋出error.badfetch事件。
????VoiceXML中的<script>元素沒有type屬性(這一點(diǎn)和HTML的<SCRIPT>元素不一樣),ECMAScript是VoiceXML必須的腳本語言。
????每個<script>元素在它的父元素的作用域內(nèi)被執(zhí)行,即它沒有自己的作用域。例如在<script>元素用var語句聲明的變量的作用域?yàn)樵?lt;script>元素的父元素(用ECMAScript的術(shù)語來說,就是"變量對象"為包含<script>元素的元素的當(dāng)前作用域)。
????下面的例子中<block>包含有<script>元素,并初始化該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> 
          <var name="hours"/>
          <var name="minutes"/>
          <var name="seconds"/>
          <block>
            <script>
              var d = new Date();
              hours = d.getHours();
              minutes = d.getMinutes();
              seconds = d.getSeconds();
            </script>
           </block>
           <field name="hear_another">
             <grammar type="application/srgs+xml" src="/grammars/boolean.grxml"/>
               <prompt>
                 The time is <value expr="hours"/> hours,
                 <value expr="minutes"/> minutes, and
                 <value expr="seconds"/> seconds.
               </prompt>
               <prompt>Do you want to hear another time?</prompt>
              <filled>
                <if cond="hear_another">
                  <clear/>
                </if>
              </filled>
            </field>
         </form>
      </vxml>
????<script>元素的內(nèi)容在和<var>元素一樣的作用域內(nèi)被求值(見5.1.2和5.3.1節(jié))。
????由于設(shè)置了ECMAScript的作用域鏈,因此,無論是<var>元素聲明的變量,還是在<script>元素中聲明的變量,它們的作用域都是包含該<var>元素或<script>元素的元素的作用域。例如,在<form>的<script>元素中聲明的變量的作用域?yàn)閐ialog,它能夠作為一個作用域?yàn)閐iaolog的變量被訪問:
      <?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>
          <script>
             var now = new Date(); <!-- this has a dialog scope-->
           </script>
           <var name="seconds" expr="now.getSeconds()"/> <!-- this has a dialog scope-->
           <block>
             <var name="now" expr="new Date()"/> <!-- this has an anonymous scope -->
             <script>
                var current = now.getSeconds();<!-- "now" in the anonymous scope -->
                var approx = dialog.now.getSeconds(); <!-- "now" in the dialog scope -->
             </script>
           </block>
         </form>
      </vxml>
????所有的變量在被ECMAScript腳本或VoiceXML元素引用之前都必須聲明,詳見5.1.1節(jié)。
?
十三、LOG
????<log>元素讓應(yīng)用程序可以產(chǎn)生日志或調(diào)試信息,這些信息能夠用來幫助開發(fā)者開發(fā)程序,或進(jìn)行執(zhí)行后的程序性能分析。
????<log>元素可以包含文本(CDATA)和<value>元素的任意組合,產(chǎn)生的信息由文本和<value>元素的cond屬性值串聯(lián)起來組成。
????信息的顯示和記錄方式是依賴于平臺的,lable屬性的用法也是依賴于平臺的。
????<log>元素中的ECMAScript表達(dá)式根據(jù)它們在文檔中的順序求值,使用<log>元素不應(yīng)該對文檔的解釋產(chǎn)生任何的副作用。
      <log>The card number was <value expr="card_num"/></log>
????<log>元素的屬性:
label 一個字符串,例如它可以用來表明該<log>元素的目的。
expr 一個ECMAscript表達(dá)式,它的結(jié)果值為一個字符串。
表52:<log>元素的屬性
posted on 2006-09-16 22:50 鐵觀音 閱讀(946) 評論(0)  編輯 收藏 引用 所屬分類: VoiceXML2.0規(guī)范
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久这里有精品15一区二区三区| 欧美一区三区三区高中清蜜桃 | 欧美一区二区三区免费视| 国产欧美韩国高清| 欧美日韩国产成人高清视频| 久久久91精品国产| 亚洲国产乱码最新视频| 久久精品一区二区三区中文字幕| 国产精品美女主播| 欧美日精品一区视频| 久久久久久久久久久久久9999| 亚洲欧美日韩综合| 亚洲一区国产视频| 亚洲一区二区三区高清 | 亚洲欧美精品在线| 在线视频你懂得一区| 免费成人在线视频网站| av成人动漫| 一本一本a久久| 亚洲伦理网站| 亚洲图片欧美午夜| 亚洲永久在线| 久久久噜噜噜久噜久久| 美国十次成人| 欧美sm视频| 欧美激情一区二区三区在线| 欧美成人精品h版在线观看| 欧美成人有码| 久久成人免费日本黄色| 欧美日韩国产999| 99国产一区二区三精品乱码| 久久精品国产精品亚洲精品| 亚洲精品免费网站| 久久精品国产精品亚洲| 国产精品婷婷| 国产日韩av高清| 欧美高清在线视频| 美女精品在线| 欧美久久久久| 久久久99爱| 蜜臀av一级做a爰片久久 | 亚洲视频免费| 欧美一区深夜视频| 亚洲欧美另类久久久精品2019| 午夜精品理论片| 久久乐国产精品| 亚洲日本黄色| 亚洲免费在线看| 欧美日韩成人在线播放| 国产欧美日韩综合| 激情久久影院| 久久久久99| 99国产精品99久久久久久| 欧美专区亚洲专区| 国产日韩三区| 亚洲一二三区在线| 欧美激情在线观看| 蜜臀久久久99精品久久久久久 | 欧美日韩国产精品一卡| 亚洲电影观看| 欧美在线视频全部完| 亚洲国产婷婷香蕉久久久久久99| 亚洲一区综合| 日韩午夜中文字幕| 欧美大胆成人| 亚洲免费激情| 可以看av的网站久久看| 国产日韩欧美91| 亚洲欧美日韩久久精品| 亚洲精品国产品国语在线app| 久久青青草综合| 欧美性片在线观看| 一区二区精品在线| 亚洲黄色视屏| 欧美国内亚洲| 亚洲精品资源美女情侣酒店| 韩国一区二区三区美女美女秀| 亚洲综合欧美| 亚洲人www| 久久人人看视频| 韩国一区电影| 午夜亚洲精品| a91a精品视频在线观看| 欧美日产一区二区三区在线观看 | 欧美在线播放一区二区| 一区二区三区四区国产| 欧美性大战xxxxx久久久| 一本在线高清不卡dvd| 亚洲精品一区二区三| 欧美区亚洲区| 亚洲专区一区二区三区| 亚洲天天影视| 国产精品自在欧美一区| 中日韩高清电影网| 久久精品国产欧美亚洲人人爽| 亚洲成人在线视频播放 | 欧美暴力喷水在线| 久久嫩草精品久久久久| 亚洲国产精品毛片| 亚洲国产精品一区在线观看不卡| 欧美成人有码| 欧美绝品在线观看成人午夜影视| 制服诱惑一区二区| 中文精品视频| 欧美日韩国产在线看| 亚洲一区日韩在线| 久久精品水蜜桃av综合天堂| 亚洲人成绝费网站色www| 99在线热播精品免费| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品狼人久久影院观看方式| 亚洲激情不卡| 99国产精品久久久久老师| 久久永久免费| 久久国产精品网站| 乱人伦精品视频在线观看| 国产一区香蕉久久| 亚洲精品视频一区| 国产日韩高清一区二区三区在线| 欧美大片免费观看| 久久婷婷久久一区二区三区| 免费黄网站欧美| 午夜精品久久久久久久白皮肤| 久久精品2019中文字幕| 亚洲午夜在线观看| 久久午夜精品一区二区| 亚洲女女女同性video| 久久免费国产| 亚洲欧美自拍偷拍| 亚洲视频一起| 亚洲美女免费精品视频在线观看| 久久久久女教师免费一区| 亚洲特级片在线| 亚久久调教视频| 亚洲欧美一区二区三区久久| 欧美日韩精品一区二区天天拍小说| 欧美日韩国产系列| 激情av一区二区| 亚洲一级片在线观看| 麻豆精品视频在线| 亚洲一级黄色片| 9久草视频在线视频精品| 国产精品资源| 免费在线看成人av| 久久精品理论片| 久久久xxx| 欧美亚洲午夜视频在线观看| 米奇777在线欧美播放| 久久成人精品无人区| 亚洲电影在线看| 亚洲国产成人tv| 欧美精品久久99久久在免费线| 亚洲在线成人| 亚洲欧洲在线播放| 欧美高清免费| 亚洲人午夜精品免费| 美日韩精品视频| 中文在线一区| 欧美一区二区黄| 在线成人亚洲| 国产精品毛片大码女人| 国产九九视频一区二区三区| 亚洲人成网站精品片在线观看| 9色精品在线| 欧美日韩精品高清| 亚洲淫片在线视频| 日韩视频精品在线观看| 欧美日本成人| 91久久久一线二线三线品牌| 亚洲最新色图| 91久久国产精品91久久性色| 一区二区激情视频| 国语对白精品一区二区| 欧美连裤袜在线视频| 午夜久久一区| 国产噜噜噜噜噜久久久久久久久 | 亚洲视频一二| 亚洲国产女人aaa毛片在线| 欧美中日韩免费视频| 亚洲经典在线| 亚洲剧情一区二区| 精品成人在线视频| 亚洲综合社区| 欧美精品免费在线| 在线免费观看视频一区| 亚洲尤物在线| 黄色一区三区| 欧美va天堂| 中文网丁香综合网| 销魂美女一区二区三区视频在线| 91久久久精品| 狂野欧美一区| 欧美大片在线观看| 欧美一区二区免费视频| 久久久精品五月天| 另类专区欧美制服同性| 亚洲国产精品美女| 欧美激情第3页| 亚洲一区免费| 欧美绝品在线观看成人午夜影视 |