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

鐵觀音

C++編程寶典

   ::  ::  ::  ::  :: 管理 ::
  1 隨筆 :: 19 文章 :: 0 評論 :: 0 Trackbacks
第二章??Dialog的結構
?
第一節 Forms ?
?
????form是VoiceXML文檔的主要組成部分,它包括以下幾個部分:
??????1、一組form item,即在FIA(form interpretation algorithm)的主循環被訪問的一些元素。Form item可細分為input item和control item,input item可由用戶填充,而control item不能;
??????2、非form item(non-form item)變量的聲明;
??????3、事件處理;
??????4、填充后(filled)的操作,也就是當某些input item的組合被賦值后要執行的程序邏輯模塊。
????Form元素的屬性:
id Form的名字。如果有指定的話,這個form就可以在該文檔內被引用,或者在別的文檔中引用它。例如,<form id="weather">,<goto next="#weather">。
scope 該form語法的默認作用域(scope)。如果它的值為dialog,則該form語法只是在這個form里是激活的;如果它的值為document,則該form語法在這個文檔的任何對話中都是激活的;如果該文檔為應用根文檔,則該form語法在這個應用的任何文檔的任何dialog中都是激活的。注意,單獨的form的語法作用域的優先權高于默認的語法作用域。例如在非根文檔的某個form默認的作用域為dialog,且有一個form語法的作用域為document,則該語法在這個文檔的任何對話中都是激活的。
表3:<form>元素的屬性
????這一節描述了關于form的一些概念,并給出了它們的一些操作的具體例子。
?
一、Form的解釋
????form由內置的FIA解釋。FIA有一個主循環用來重復選定一個form item并訪問它。被選定的form item是在文檔順序中第一個警戒條件不滿足的form item。例如,field的默認警戒條件檢測看該field的form item變量是否有值。因此,如果一個簡單的form只包含了幾個field,則每個field會順序地提示給用戶。
????解釋一個form item一般包括以下步驟:
??????1、選定并播放一個或多個prompt;
??????2、收集用戶的輸入,或填充一個或多個input item的響應,或一些事件的拋出(例如help);
??????3、解釋屬于最新的input item的填充的<filled>操作。
????FIA終止于解釋一個控制語句的跳轉(例如用<goto>元素到另一個對話或文檔,或者一個<submit>元素把數據提交到文檔服務器)。當再沒有符合條件的form item可以被選定時,FIA也隨著一個隱式的<exit>而中止。
????關于FIA更詳細的說明見2.1.6節。
?
二、Form Items
????form item就是在FIA的主循環中能夠被訪問的元素。Input item控制FIA為特定的元素收集信息。當FIA選定一個control item時,該control item可以包含一個要執行的代碼塊,或告訴FIA開始為混合主動式的form的提示和收集進行初始化。
?
????<一>、Input Items
????input item指定了得到用戶輸入的input item變量。它有一些提示,告訴用戶要說或者鍵入什么;還有定義允許的輸入的語法;還有處理一些由此產生的事件的事件處理。Input item也可以有<filled>元素,它定義了input item變量被填充以后要進行的操作。Input item有以下幾個:
<field> 它的值是通過ASR或DTMF語法獲得的。
<record> 它的值是用戶錄音的一段音頻。例如,<record>元素可以用來收集語音郵件的語音信息。
<transfer> 它把用戶轉接到另一個電話號碼。如果該轉接返回控制,則把該轉接結果的狀態賦值給它的變量。
<object> 它通過一些參數調用依賴于平臺的object,該object是一個ECMAScript Object。平臺的object可以是一個內置的dialog,比如說用來收集信用卡信息的dialog。也可以是用特定的DTMF文本方法收集文本消息的dialog。雖然當依賴于平臺的object不被平臺支持時,要拋出error.unsupported.objectname事件來處理<object>元素(專門的事件變量“_message”提供了更詳細的錯誤信息,詳見5.2.2節),但是對于這些依賴于平臺的object的執行卻是沒有任何限制的。
<subdialog> <subdialog>有點像函數調用。它調用同一文檔中的另一個dialog,或者調用另一個文檔。它返回的是一個ECMAScript Object。
表4:Input Items
?
????<二>、Control Items
????control item有兩種:
<block> 它包含一些程序語句的序列,這些程序語句是用于提示和計算的,不是用于收集輸入的。<block>有一個form item變量(通常是隱含的),在它被解釋之前,該變量被置為true。
<initial> 該元素用于在混合主動式的form里控制最初的交互。它應該提示用戶說一些話來匹配一個form級別的語法。在<initial>元素的執行中,當至少有一個input item變量被識別結果所填充時,<initial>元素的form item變量變為true,從而把它置為不是FIA可選定的。
表5:Control Items
?
三、Form Item變量和條件
????每個form item都有一個和它相關的form item變量,當進入該form時,它的默認值為undefined。Input item的form item變量包含了解釋該form item的結果。Input item的form item變量也稱為input item變量(Input item variable),它保存了從用戶那里收集到的值。Input item變量可以用name屬性給它命名;或讓它匿名,此時會產生一個內部名稱。
????每個form item也有一個警戒條件,它決定該form item是否能夠被FIA選定。默認的警戒條件只是檢測該form item是否有非undefined的值,如果有,該form item就不會被訪問。
????通常,input item都會有名稱,control item都沒有名稱;form item變量都沒有被賦初始值,且沒有指定附加的警戒條件。但有些時候需要更精確地控制。如:form可以在開始的時候給一個form item 變量賦初始值來跳過相應的field的執行,然后清零(如用<clear>元素)并強制該field重新被選定;另一個field可以有一個警戒條件,只有當該field沒有被選定過,且其他兩個field已經被填充時才激活它;或只有當某個條件為true時,<block>才能執行。這樣一來,哪些form item會被FIA選定并執行的順序可以得到更好的控制。然而,通常很多對話都可以不用這么復雜。
????總的來說,所有的form item都有如下的屬性:
name 該form item變量的名稱,作用域為dialog。它保存了該form item的值。
expr 給form item變量賦初始值,默認的初始值為ECMAScript 的undefined 。如果有初始值,則該form item不會被執行,除非該form item變量被清零。
cond 它是一個表達式的值,如果缺省,默認值為true。如果是在<initial>元素里,它用來檢測是否有input item被填充了。
表6:Form Item共有的屬性
?
四、Directed Forms
????最簡單、最普通的form類型是,在computer-directed交互中,該form的form item正好被順序地執行一次。
      <?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>
????該對話執行的順序為:
      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的第一次循環選定時,選定了第一個block,因為它的form item變量(隱含的)值為undefined。該block輸出了它的提示語,且它的form item變量被置為true。在FIA的第二次反復選定時,略過了第一個block,因為它的form item變量值不為undefined,此時FIA選定了名為“state”的field,因為該field的變量state的值為undefined。該field提示用戶輸入州名,然后把變量state置為用戶輸入的答案。關于field級的語法填充form item變量的具體描述見3.1.6節。第三次提示并收集名稱為city的field。第四次執行了最后的block,并跳轉到另外一個URI。
????這個例子里的每個field都有播放一段提示語引導用戶輸入,有一個語法指定要監聽的內容,有help事件的事件處理。無論何時,只要用戶要求幫助,help事件就會被拋出。Help事件處理捕獲這些事件并播放一段更詳細的提示語。
????下面還有一個機器主導的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>
????注意:語法的可選項‘amex’和‘american express’返回的真實值需要在條件表達式中分開處理。3.1.5節描述了語法中的語義元素怎樣才能對多種輸入返回一個單獨的值。
????該對話的流程可能是這樣的:
      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聲明了一個變量并指定了相應的提示語、語法、DTMF序列、幫助信息和其他一些事件處理。每個field聲明了一個VoiceXML form item變量,它的作用域為該form的dialog。該field被填充后,它的變量可以被提交,也可以賦值給其他的變量。
????每個field有它自己的語音和(或)DTMF語法,既可以明確的使用<grammar>元素指定,也可以用type屬性隱含地指定。Type屬性用于指定內置的語法,像digits、boolean或number。
????每個field可以有一個或多個提示語。如果有一個提示語,它會被反復地播放給用戶,直到用戶輸入信息。若有多個提示語則根據提示語選擇算法來選定提示語(詳見4.1.6節)。在每次要播放提示語的時候,count屬性可以決定用哪一條提示語。在這個例子,提示語越變越短,這叫做錐形提示(tapered prompting:語音提示漸漸地簡短而精煉,或越來越精細)。
????<catch event="help">元素是一個事件處理,它定義了當用戶請求幫助時該做什么。幫助信息也可以是分級的。這些信息可以簡化,下面兩個元素的效果是等同的。
      <catch event="help">
         Please say visa, mastercard, or amex.
      </catch>
										
      <help>
         Please say visa, mastercard, or amex.
      </help>
????<filled>元素定義的是,當用戶提供了相應field要識別的輸入后該做什么。一個用途就是在語法檢查之后再指定一套完整的約束,像上面例子中名為expiry_date的field。
?
五、Mixed Initiative Forms
????上一節我們討論了執行嚴格的,由計算機主導的會話,要實現混合主動式的form,即計算機和用戶共同主導該會話,必須有一個或多個form級別的語法。這種會話的編寫有幾種方式,其中一種普遍的方式是使用<initial>元素和<field>元素,<initial>元素用來獲得全面的信息,而<field>元素用來獲得特定的信息。下面的例子說明了這一點。其他一些更復雜的技巧也可以取得同樣的效果,例如使用<initial>元素的cond屬性。
????如果某個form擁有幾個form級別的語法,那么:
??????1、它的input item在任何順序中都能夠被填充;
??????2、用戶的一個utterance就可以填充一個以上的input item。
????只有input item能夠被form級別的語法的匹配結果填充,control item不能。關于form級別的語法填充field變量的描述見3.1.6節。
????當用戶在其他的對話內,form級別的語法也可能是激活的。假如某個文檔有兩個form,一個是汽車租金的form,另一個是酒店預定的form,它們都有在整個文檔激活的語法,在和酒店預定的form交互的時候,用戶可以輸入汽車租金的信息,引導計算機到汽車租金的form里。用戶可以根據任何激活的語法講話,填充input item和進行相應的操作。
????例子。下面的例子是天氣信息服務的第二個版本,是混合主動式的。這個例子為了增強它的說明性,加入了廣告和城市名及州名的確認:
      <?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>
????下面是該例子的一個可能的流程,它顯示了它的優勢,即使該用戶是個新手:
      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有一個modal屬性,它的值為true,它的作用是使所有的語法都失效,除了當前form item中定義的那個語法,因此,在該field中只有boolean語法是激活的。
????有經驗的用戶可以更快的完成流程,但是他還是必須要聽廣告:
      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可以用多種方式定制。其中一種方法是給一個form item變量賦值,這樣該form item就不會被選定了;另一種方法是用<clear>把form item變量置為undefined,強制FIA再次訪問該form item。
????還有一種是用<goto>元素的nextitem屬性明確地指定下一個要訪問的form item,該方法強加了一個到目標form item 的立即跳轉。目標form item的變量、條件和計數器都不會被重置。即使該form item已經被訪問過,他的提示語還是會播放的。如果<goto nextitem>跳轉出現在<filled>中,該<filled>剩下的操作和任何掛起的<filled>操作都會被跳過。
????下面這個例子中<goto nextitem>出現在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>
????無論用戶在哪個要收集的問題中說“exit”,平臺都會拋出exit事件,并由<catch>元素的事件處理捕獲。該事件處理把FIA引導到下一個要訪問的field,“confirm_exit”。confirm_exit域在正常的調查完成過程中將不再被訪問,因為其前面的<block>元素將控制轉向“register”腳本。
?
六、Form Interpretation Algorithm
????我們已經從概念上討論了FIA,在這一節,我們將更詳細地討論它(更詳細的描述見附錄C)。
?
????<一>、Initialization Phase
????FIA只要進入一個form就會初始化它。內部的提示語計數器變量(在form的dialog作用域內)被置為1。每個變量(form級別的<var>元素和form item變量)根據在文檔中的順序被一一初始化為undefined和相應的expr屬性的值。
?
????<二>、Main Loop
????FIA的主循環有三個階段:
????選定(select)階段:選定下一個沒有被填充的form item供訪問。
????收集(collect)階段:訪問被選定的form item,播放它的提示語讓用戶輸入,激活相應的語法,等待收集用戶的輸入(例如語音或DTMF按鍵輸入)或者事件(例如請求幫助或noinput timeout)。
????處理(process)階段:處理用戶輸入,填充form item并執行<filled>元素的操作,例如確認輸入;處理事件,執行該事件相應的事件處理。
????注意:FIA可以被給定一個輸入(一組語法槽值(grammar slot/slot value pairs)),該輸入是用戶在另外一個FIA時被收集到的。在這種情況下,主循環的第一次循環跳過了選定和收集階段,直接跳到處理階段,使用給定的輸入處理。另一個要注意的是,如果在選定或收集階段有錯誤發生,產生一個事件,該事件被拋出,FIA也直接跳到處理階段。
?
??????1、Select phase
??????選定階段的目的是選定下一個要訪問的form item,當出現以下情況時,選定階段結束:
??????如果上一次主循環的處理階段指定了一個<goto nextitem>,則該指定的form item被選定。
??????另外,如果第一個form item的警戒條件為false,則該form item被選定。在檢查警戒條件時,如果發生錯誤,事件被拋出,FIA跳過收集階段,進入處理階段,處理該事件。
??????如果沒有任何form item的警戒條件為false,且FIA最后一次循環完成時沒有碰到明確的控制跳轉,FIA會執行一個隱含的<exit>操作(類似的,如果執行是在form 之外,例如當在form之外產生一個錯誤時,沒有任何明確的控制跳轉,解釋器將執行一個隱含的<exit>操作)。
?
??????2、Collect phase
??????收集階段的目的是收集用戶輸入或事件。當一個form item被選定時,FIA要執行的操作取決于該form item的類型:
??????如果訪問的是一個field item,FIA根據該field item的提示語計數器和提示語條件選定提示語,進行排隊,然后激活并監聽該field級別的語法和任何其他更高級別的激活的語法,等待語法識別和某個事件。
??????如果訪問的是<transfer>,FIA根據提示語計數器和提示語條件對提示語進行排隊,激活該item的語法,在該transfer執行前播放它的提示語隊列。
??????如果訪問的是<subdialog>或<object>,FIA根據提示語計數器和提示語條件對提示語進行排隊,FIA沒有激活語法,相反,執行環境給subdialog或object指定了收集輸入的行為。在執行subdialog或object之前不播放提示語隊列,而應該在后來的輸入收集的時候播放。
??????如果訪問的是<initial>,FIA根據該<initial>的提示語計數器和提示語條件選定提示語,進行排隊,然后監聽form級別的語法和其他更高級別的激活的語法,等待語法識別和某個事件。
??????如果訪問的是<block>,FIA把它的form item 變量置為true,對它的內容求值,跳過處理階段,沒有收集任何輸入,FIA主循環的下一次循環進入該<block>。
?
??????3、Process phase
??????處理階段的目的是處理上一個階段收集到的輸入或事件。
????????(1)、如果出現一個事件(如noinput或掛機),FIA確定該應用的catch元素并執行它,該應用catch元素在當前form item 的范圍內選定,在該會話封裝的范圍內進行,這樣可能會導致該FIA終止(例如,如果它跳轉到一個對話或文檔,或執行了<exit>),或者可能導致FIA進入主循環的下一個循環(如,執行幫助的默認事件處理)。
????????(2)、如果某個輸入匹配了<link>語法,則FIA執行該link的跳轉,或者拋出它的事件,如果<link>拋出一個事件,事件在當前的form item(如<initial>、 <field>、<transfer>等等)的環境下處理。
????????(3)、如果輸入匹配了一個不同于當前form的另一個form的語法,該FIA終止,另一個form被初始化,該form的FIA帶著這個輸入直接進入它的處理階段。
??????如果某個輸入匹配了該form的語法,則:
????????(1)、該語法的語義結果被映射到一個或多個form item變量,詳細描述見3.1.6節;
????????(2)、FIA標識這些賦值所觸發的<filled>操作,詳細描述見24節;
????????(3)、FIA根據它們在文檔中的順序執行每個<filled>操作。如果遇到<submit>、<disconnect>、<exit>、<return>、<goto>或者<throw>元素,就不會再執行剩下的<filled>元素了,FIA要么終止,要么繼續主循環的下一個循環。<reprompt>不會終止FIA(終止意味著一個操作),只是相當于給相應的prompt做個標記,讓FIA在下一次循環再次播放prompt。如果在執行某個<filled>時拋出一個事件,FIA將在該<filled>的作用域內開始選定事件處理,該作用域可以是一個 form item或者該form自己,然后在該dialog作用域外處理。
??????在完成處理階段后,解釋器繼續返回到選定階段。
????關于FIA更詳細的描述見附錄C。

第二節 Menus ?
?
????menu在語法上是一個form的另一種形式,該form包含了單個的匿名的field。menu提示選擇一個選項,并根據該選項跳轉到相應的dialog。就像一個正規的form一樣, menu也有它自己的語法作用域,例如當用戶在執行另一個dialog時,它的語法也可以是激活的。下面的例子中,menu給用戶提供了3個選項:
      <?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>元素可以標識一個菜單,并確定它的語法的作用域。Menu的屬性如下:
id Menu的標識符,它允許dialog通過<goto>或<submit>跳轉到該menu。
scope Menu的語法作用域。如果它的值為“dialog”,只有當用戶跳轉到該menu,它的語法才是激活的。如果它的值為“document”,它的語法在整個文檔內(或者,如果該menu在應用根文檔里,在該應用中,所有加載的文檔內)都是激活的。
dtmf 當它的值為“true”,前九個choice如果沒有明確的指定dtmf屬性,則它們會得到隱含的dtmf屬性,如“1”、“2”等。剩下的那些沒有明確指定dtmf屬性的choice不會得到DTMF值(因此它們不能通過DTMF按鍵來匹配)。此時,如果該menu有choice指定了它自己的DTMF序列,該序列包含除了“*”、“#”或“0”以外的字符,平臺要拋出error.badfetch 事件。該屬性默認值為“false”。
accept 當它的值為“exact”(該值為默認值),則該menu中的choice元素的文本定義的是要識別的精確的短語。如果它的值為“approximate”,則該menu中的choice元素的文本定義的是要識別的近似的短語(如2.2.5節中描述的)。<choice>的accept屬性的優先權高于menu的該屬性。
表7:<menu>元素的屬性
?
二、CHOICE
????<choice>元素有下面幾個作用:
??????1、它可以指定一個語音語法,用<grammar>元素定義或由程序自動產生,詳細描述見2.2.5節;
??????2、它可以指定一個DTMF語法,詳見2.2.3節;
??????3、它的內容可以作為<enumerate>的提示語,詳見2.2.4節;
??????4、當某個選項被選擇的話,它要么指定了要拋出的事件,要么指定了要跳轉的URI。
????<choice>的屬性有:
dtmf 該<choice>元素的DTMF序列。它的作用等同于一個簡單的DTMF語法,或者應用于該序列識別的DTMF property(6.3.3節)。它和DTMF不同的是,它的空格是不起作用的:dtmf=“123#”和 dtmf=“1 2 3 #”是等同的。
accept 該<choice>元素的“accept”屬性的優先權高于所在的<menu>元素的“accept”屬性。當該屬性的值為“exact”(默認),<choice>元素的文本定義了要識別的精確的短語;當該屬性值為“approximate”,<choice>元素的文本定義的是要識別的近似的短語(詳見2.2.5節)。
next 要跳轉的下一個對話或文檔。
expr 一個表達式,它的值為要跳轉的URI,而不指定“next”屬性。
event 指定一個要拋出的事件,而不指定“next”屬性。
eventexpr 一個ECMAScript表達式,它的值為要拋出的事件名。
message 一個信息串,它提供了關于要拋出的事件的上下文。在<catch>元素的作用域內用變量“_message”可以得到該信息串,詳見5.2.2。
messageexpr 一個 ECMAScript表達式 ,它的值為一個信息串。
fetchaudio 見6.1節。它默認為<property>的fetchaudio的值。
fetchhint 見6.1節。它默認為<property>的documentfetchhint的值。
fetchtimeout 見6.1節。它默認為<property>的fetchtimeout的值。
maxage 見6.1節。它默認為<property>的documentmaxage的值。
maxstale 見6.1節。它默認為<property>的documentmaxstale的值。
表8:<choice>元素的屬性
????必須正確地指定屬性“next”、“expr”、“event”和“eventexpr”中的一個,否則會拋出error.badfetch事件。也可以正確地指定屬性“message”或“messageexpr”中的一個,否則會拋出error.badfetch事件。
????如果在<choice>中指定了一個<grammar>元素,則該外部語法用于替換自動產生的語法。這樣開發者就可以準確地控制<choice>元素的語法,例如:
      <?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可以只有語音語法,也可以只有DTMF語法,也可以在<menu>中包含一個<property>元素同時指定DTMF和語音語法。下面的例子中的menu只有DTMF語法,并且使用<choice>元素的dtmf屬性給每個<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,自動的為前九個沒有指定DTMF序列的<choice>元素指定一個DTMF序列,第一個為“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>元素用于為用戶自動產生<choice>元素的描述,它指定了一個模板,該模板根據<choice>元素在<menu>元素中的順序,依次應用于每個<choice>。如果<enumerate>中沒有內容,則使用默認的模板,列出所有的<choice>。該默認的模板取決于解釋器環境。如果<enumerate>中有內容,這些內容就是模板的樣式,它可以引用兩個專有變量,“_prompt”和“_dtmf”,前者表示<choice>元素的提示語,后者表示<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的提示語為:
      C: Welcome home. For sports, press 1. For weather, press 2. For Stargazer astrophysics news, press 3.
????<enumerate>元素可用于<menu>元素中的<promppt>和<catch>元素,也可以用于包含有<option>元素的<field>元素。如果<enumerate>用于其他的地方,平臺會拋出error.semantic事件(例如<enumerate>元素中包含有<enumerate>元素)。
?
五、Grammar Generations
????每個選項的文本(choice phrase)都指定了一組要監聽的詞或短語。一個選項的文本由直接或間接包含在<menu>元素中的<choice>元素中的元素的PCDATA組成,或由<field>元素中的<option>元素的PCDATA組成。
????如果accept的屬性值為“exact”,則用戶必須匹配選項文本中的整個短語,且順序也要相同。
????如果accept的屬性值為“approximate”,則用戶可以匹配選項文本中的短語的子短語。例如,對于響應選項文本“Stargazer astrophysics news”,用戶可以說“Stargazer”, “astrophysics”, “Stargazer news”, “astrophysics news”等。產生的語法是依賴語語言和平臺的。
????如下面的例子,在不同的選項中分別使用“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>
????由于第一個選項的accept屬性值為“approximate”,因此要匹配這個選項,用戶可以只說出子短語;例如“Stargazer”或“Astrophysics News”。然而,由于第二個和第三個選項的accept屬性值為“exact”,因此只有說出整個短語“Physics Weekly”和“Particle Physics Update”才能匹配語法。
????在下面的例子中,在<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>元素的選項文本由音頻文件播放,如果該音頻文件不能被播放,則會以語音合成的方式播放“Stargazer Astrophysics News”。該<choice>元素的語法的精確匹配短語“Stargazer astrophysics news”來自<choice>元素的PCDATA。
?
六、Interpretation Model
????<menu>和只包含一個簡單的<field>的<form>的工作機制類似。Menu的事件處理相應的對應于<field>的事件處理。<menu>的語法相應的對應于<form>的語法。和在<form>中一樣,<menu>中的語法匹配也會更新數組application.lastresult$。這些變量在5.1.5節中由詳細描述。
????一旦進入<menu>,它的語法就被自動生成并激活,然后播放提示語。當用戶的輸入匹配了一個<choice>控制該<choice>的next, expr, event或eventexpr屬性值跳轉。這四個屬性中,同時只可以指定一個。如果指定了一個event屬性,而該事件的事件處理沒有讓解釋器退出或把控制跳轉到其他dialog,則FIA會將該<menu>的anonymous field清零,再次執行該<menu>。


第三節 Form Items
?
?
????form item就是一個<form>中的元素,該元素在form解釋期間可以被訪問。這些元素包括<field>、<block>、<initial>、<subdialog>、<object>、<record>和<transfer>元素。
????所有的form item都有下面的特點:
??????·它們都有一個變量,由name屬性指定。該變量可以通過expr屬性獲得初始值。
??????·它們都有一個警戒條件,由cond指定。如果一個form item沒有被填充,且它的警戒條件沒有指定或值為true,則該form item可以被訪問。
????Form item可再細分為input item和control item,前者定義了該form的input item變量,后者用于幫助控制該form的input item的收集。Input item(<field>、<subdialog>、<object>、<record>和<transfer>)一般來說包含下面幾個元素:
??????·<filled>元素,它包含了一些在相應的input item被填充后要執行的操作。
??????·<property>元素,用于指定作用于該input item(<initial>元素也可以包含<property>元素)的property。
??????·<prompt>元素,用于指定相應的元素被訪問時要播放的提示語。
??????·<grammar>元素,用于指定該input item(<subdialog>不能包含<grammar>元素)允許輸入的語音或DTMF按鍵。
??????·<catch>元素及它的一些簡寫形式,用于指定作用于該input item(<initial>元素不能包含<catch>元素)的事件處理。
????每個input item都有相應的一組影子變量。影子變量用于返回一個input item執行后的結果。而不是返回要存儲于name屬性的值。例如,在<field>的語法識別結果中有這次識別的confidence level(它是一個影子變量),獲得這個值對我們可能有很大的幫助。影子變量的引用可以使用如下這種形式:name$.shadowvar,name就是該input item的name屬性的值,shadowvar就是指定的影子變量名。影子變量是可寫的,它的值可以被應用更改。例如,<field>返回的影子變量,confidence。下面的例子展示了怎樣訪問這個影子變量。
      <?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>
????在這個例子中,識別結果的confidence要經過檢查,confidence值太低的結果不會被接受。
?
一、FIELD
????<field>是一個form item,用于收集用戶輸入,它的屬性有:
name 該form item的form item變量,它的作用域為dialog,它保存了識別的結果,在所在的form的form item中,該form item變量名必須是唯一的,如果該變量名不是唯一的,在獲取文檔時會拋出error.badfetch事件,該變量名必須符合變量的命名規則,詳見5.1節。
expr 該form item變量的初始值,默認為ECMAScript 的undefined。如果給它一個初始值,該form item 將不會被訪問,除非它被清零。
cond 一個表達式,當它的結果值為true時,該form item才被訪問。如果沒有指定該屬性值,也能被訪問。
type 該<field>的類型,即內置語法類型的名稱(詳見附錄P)。平臺對內置語法類型的支持是可選的。如果不支持一個指定的內置語法類型,要拋出一個error.unsupported.builtin 事件。
slot 語法槽名,用于存放變量(如果沒有指定,默認值為該變量名)。當所用的語法格式支持返回一組成對的槽/值(slot/value)的機制,且槽名與該form item變量名不同時,該屬性就很有用。
modal 如果它的值為false(默認值),在該field的收集階段所有激活的語法都可以匹配;如果它的值為true,則只有該field的語法是允許匹配的,其它的都暫時失效。
表9:<field>元素的屬性
????下表是<field>元素的影子變量(shadow variables),該<field>的form item 變量名為name。影子變量utterance、 inputmode 和 interpretation的值必須和application.lastresult$ (詳見5.1.5節)中相應變量的值一樣。
name$.utterance 被識別的詞的原始串。正確的標記和拼寫是依賴于平臺的(例如“five hundred thirty”或“5 hundred 30”或只是“530”)。如果是DTMF語法,該變量將包含匹配的數字串。
name$.inputmode 用戶輸入的模式,值為dtmf或voice。
name$.interpretation 一個ECMAscript變量,它包含了用戶輸入的語義解釋,詳見3.1.5。
name$.confidence 該<field>的confidence級別,它的取值范圍為0.0-1.0,0.0表示最小的confidence,1.0表示最大的confidence。平臺可以用utterance的confidence (application.lastresult$.confidence的值)作為name$.confidence 的值 ,<field>和utterance 級別的confidence之間的差別是依賴于平臺的。 Confidence值更詳細的解釋是依賴于平臺的,因為它的計算方法很可能每個平臺不一樣。
表10:<field>元素的影子變量
?
????<一>、使用顯式語法的<field>
????顯示語法可以通過絕對的或相對的URI指定:
      <field name="flavor">
        <prompt>What is your favorite ice cream?</prompt>
        <grammar src="../grammars/ice_cream.grxml" type="application/srgs+xml"/>
      </field>
????也可以指定一個聯機(inline)語法,下面的例子使用了W3C ABNF格式的語法。
      <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>
????如果同時指定<grammar>元素的src屬性和聯機語法,平臺會拋出error.badfetch事件。
?
????<二>、使用依賴于平臺的內置的顯式語法
????平臺對內置資源的支持是可選的,如語音語法、DTMF語法和音頻文件。這些資源使用平臺特有的URI訪問,例如http://localhost:5000/grammar/boolean,或者使用平臺特有的方案(scheme),例如通常使用的“builtin”方案,“builtin:grammar/boolean”。如果平臺支持訪問內置資源,它應該支持訪問基本的內置語法(見附錄P)。例如:
      <grammar src="builtin:grammar/boolean"/>
      <grammar src="builtin:dtmf/boolean"/>
????上面的例子中,第一個<grammar>引用了內置的boolean語音語法,第二個<grammar>引用了內置的boolean的DTMF語法。
????下面的<field>:
      <field type="sample">
        <prompt>Prompt for builtin grammar</prompt>
      </field>
????和下面這個使用平臺特有的內置語法的<field>,效果是一樣的。
      <field>
        <grammar src="builtin:grammar/sample"/>
        <grammar src="builtin:dtmf/sample"/>
        <prompt>Prompt for builtin grammar</prompt>
      </field>
????sample是基本的內置<field>的type之一(如,boolean、date等)。
????另外,依賴于平臺的內置語法的URI可用來訪問特定解釋器環境支持的語法,我們建議平臺特有的內置語法以“x-”開頭命名,因為在將來的正式版本中不會使用該命名空間。如下:
      <grammar src="builtin:grammar/x-sample"/>
      <grammar src="builtin:dtmf/x-sample"/>
?
????<三>、使用<option>列表的<field>
????當要為<field>指定一組簡單的可選項時,用<option>列表比用一個語法方便。<option>列表由包含于<field>元素中的一組<option>元素組成,每個<option>元素包含了用來產生語音語法的PCDATA,<option>的語法產生規則和2.2.5節中的<choice>一樣。<option>有一個屬性用于為每個<option>指定一個DTMF序列,還有一個屬性用于控制要賦給該<field>元素的form item變量的值。當一個<option>元素被選定時,它的屬性value的值決定了該<field>的影子變量和application.lastresult$的語義解釋值。
????下面的例子中的<field>元素給用戶提供了三個選項,把被選定的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) 
????下面的例子展示了在一個form的<catch>元素中的<enumerate>元素的正確用法和錯誤用法,該form有幾個<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級別的<catch>元素中的<enumerate>元素可以列舉一些內容:“color”和“size”<field>中的<option>元素。然而,下一個<field>就不一樣了:
      C: How many?
      H: a lot. (throws "nomatch" event caught by form-level <catch>)
????Form級別的<catch>元素中使用<enumerate>,導致平臺拋出error.semantic事件。因為“quantity”<field>中沒有包含任何可以列舉的<option>元素。
????有一種辦法可以解決,就是在“quantity”<field>元素中加一個field級別的<catch>元素,如下:
      <catch event="help nomatch">
        Please say the number of items to be ordered.
      </catch
????這樣,“nomatch”事件被<field>中的<catch>捕獲,下面是一個可能的流程:
      C: Please say the number of items to be ordered.
      H: 50.
      C: Thank you. Your order is being processed.
????<enumerate>元素在2.2.4節中也有詳細描述。
????<option>元素的屬性有:
dtmf 該<option>元素的DTMF序列,它的作用等同于一個簡單的DTMF語法,和應用于該序列識別的DTMF<property>。它和DTMF語法不同的是,它的空格是不起作用的:dtmf=“123#”跟dtmf=“1 2 3 #”的效果是一樣的。
accept 值為exact (默認)或approximate。當其值為exact時,語音識別時需完全匹配該元素定義的文本;當其值為approximate,語音識別只需大概匹配該元素定義的文本(詳見2.2.5節)。
value 當用戶選擇該<option>時,賦給該<field>元素的form item變量的字符串,無論用戶是使用語音輸入還是DTMF按鍵輸入。默認是使用<option>元素的CDATA內容賦值,這些CDATA開頭和結尾的空格都被去掉了。如果<option>沒有內容,就用DTMF序列代替。
表11:<option>元素的屬性
????使用<option>元素不排除同時使用<grammar>元素,結果將是這兩個"語法"中的任一個的匹配。而在同一個<field>中同時出現兩個<grammar>元素則意味著選項的邏輯或,即兩個語法中只能匹配一個。
?
二、BLOCK
????<block>是form item,它包含的是可執行的內容,如果該<block>的form item 變量為undefined,且“cond”屬性(如果有的話)值為true,它就會被執行。
      <block>
        Welcome to Flamingo, your source for lawn ornaments.
      </block
????當FIA進入<block>時,該<block>的form item 變量被自動的置為true。因此,每次的form調用中,<block>一般只被執行一次。
????有時候,你可以更多地控制<block>。你可以給該form item 變量命名,通過賦值或清零控制<block>的執行。該變量在該form的dialog作用域內被聲明。
????<block>的屬性有:
name 該form item變量名,它用來標記該<block>是否符合被執行的條件。默認為不可訪問的內部變量。
expr 該form item變量的初始值,默認為ECMAScript 的undefined。如果給該form item變量一個初始值,該form item就不會被執行,除非它的form item變量被清零。
cond 它是一個boolean表達式,用來判定該form item是否可以訪問。在會話之后,它的值必須為true。
表12:<choice>元素的屬性
?
三、INITIAL
????在一個典型的混合主動式的form中,當FIA播放最初的form信息給用戶時,就進入了<initial>元素,而不是進入計算機主導的模式,在計算機主導的模式中,每個field單獨地被訪問。和field item不同的是<initial>沒有任何語法,也沒有任何的<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>
????如果在訪問<initial>時拋出一個事件,則執行相應的事件處理。和其他的form item一樣,如果<initial>的form item變量為undefined,且它的cond屬性為true,它還是可以再次被訪問的。如果用戶的輸入填充了一個或多個field item變量,則在任何一個<filled>操作被執行前,所有的<initial>form item變量都被置為true。
????<initial>form item變量可以顯式地被禁用,或重新被FIA訪問。例如,在上面的例子中,<initial>的form item變量在第二個nomatch事件中被置為true,這樣,FIA就不再處理<initial>元素,而去選定下一個form item,即一個<field>,它提示用戶輸入起點城市;同樣的,<initial>元素的form item變量也可以被清零,這樣,FIA就可以再次選定該<initial>元素。
????在同一個form中可以有多個<initial>元素。只有cond屬性為true且在文檔中的順序最靠前的一個<initial>元素會被訪問。當該<initial>元素的form item變量被填充,該form 所有的<initial>元素都被置為true,因此FIA不會訪問其他的<initial>元素。顯式的重置一個或多個<initial>元素,可以使它們再次變為可用,甚至允許FIA在下一次的循環中選定另一個<initial>元素。
????在FIA的一次循環中,<initial>元素的cond屬性也可用來決定哪一個<initial>元素要被選定。一個應用可提供多個<initial>元素,但是用cond屬性限定它們只能在特定的環境下才可用。例如,用cond屬性來判斷使初級還是高級操作模式,且只有在高級操作模式中使用元素。此外,如果在文檔順序中第一個<initial>元素的cond屬性被指定了一個值,該值永遠都不會實現,則該<initial>元素也永遠不會被執行。如果每個<initial>元素的cond屬性都有一個使它們不會被選定的值,則哪一個<initial>元素都不會被執行。
????在訪問<initial>元素時,一般的語法作用域規則也會起作用,詳見3.1.3節。特別地,作用域為<field>元素內的語法都不會被激活。
????注意,顯式的給一個input item變量賦值,不會影響到<initial>元素的form item變量的值。
????<initial>元素的屬性:
name 該form item變量的名稱,用于檢測該<initial>元素是否為可選定的。默認為一個不可訪問的內部變量。
expr 該form item變量的初始值。默認為ECMAScript的undefined。如果賦一個初始值給它,該form item將不會被訪問,除非該form item變量被清零。
cond ECMAScript表達式。只有當其結果值為boolean true,該代碼塊才被執行,否則不被執行。缺省時為 true。
表13:<initial>元素的屬性
?
四、SUBDIALOG
????subdialog提供了重用相同的dialog和建立可重用應用庫的一種機制。
????在調用的dialog中的<subdialog>元素通過它的屬性src或srcexpr調用了被調用的dialog(即subdialog)。Subdialog在一個新的執行環境中執行,該執行環境包括了該subdialog中所有的聲明和狀態信息,它的文檔,應用根文檔(如果有的話),計數器重置和變量初始化。當執行了一個<return>元素或<exit>元素,或再沒有任何符合條件的form item可供FIA選定時,subdialog返回。<return>元素使控制和數據返回到調用的dialog(見5.3.10節)。當subdialog返回時,它的執行環境被刪除,且調用dialog中的執行恢復。
????<subdialog>元素所在的dialog和被調用的dialog的環境時互相獨立的,即使這兩個dialog是在同一個文檔中。在被調用的dialog中是不能訪問調用dialog的作用域鏈中的變量的。在兩個執行環境中沒有任何共享的變量實例。即使調用dialog和被調用dialog在同一個文檔中,它們的執行環境包含的也是不同的變量實例。當調用dialog和被調用dialog在不同的文檔中,但它們的根文檔是同一個時,subdialog中的根變量同樣是不同的變量實例。當subdialog返回時,所有應用于subdialog環境的變量綁定都丟失了。
????然而,在subdialog的環境中,一般的語法、事件和變量的作用域規則也適用。激活的語法包括在該subdialog的文檔和應用根文檔中的<link>,<menu>和<form>元素的適當的語法,和解釋器環境定義的默認語法。同樣的,事件處理和變量綁定也是根據標準的作用域層次進行的。
????從編程的角度看,subdialog的工作機制和子程序的工作機制是不一樣的,因為它的調用和被調用的環境是相互獨立的,subdialog不能訪問調用它的dialog中的變量實例,而子程序取可以訪問調用程序中的變量實例。類似的,subdialog在語言上不遵循事件滲透模式(event percolation model),而在java語言中,如果在某個方法中拋出事件,且該被調用的環境沒有處理該事件,則該事件會自動的滲透到調用的環境中。在subdialog中拋出的事件交由subdialog中的事件處理取處理。這些事件處理要返回到調用的環境中只有通過顯式的返回該事件。
????<subdialog>元素的src或srcexpr屬性指定了要調用的subdialog的URI(見RFC2396)。如果該URI是一個絕對或相對的URI,該URI可以包含一個查詢串,則獲取該URI并在目標文檔中尋找該subdialog。如果<subdialog>元素指定了namelist屬性,則該屬性中的變量被加入到該URI的查詢串中。
????如果該URI只包含一個段,且沒有指定namelist屬性,則不獲取任何URI,并在當前文檔中尋找要調用的subdialog。
????如果URI中有包含一個段,則該段指定了要調用的subdialog,如果沒有包含段,則以目標文檔的第一個dialog為要調用的subdialog。
????如果該URI是非法的(即它指定的diaog或文檔不存在),必須拋出一個error.badfetch事件。注意,對于那些在dialog或文檔跳轉中出現的錯誤,在什么范圍內處理是依賴于平臺的。
????<subdialog>元素的屬性有:
name 存放subdialog返回值的變量,他是一個ECMAScript Object,該對象的屬性就是<return>元素的namelist屬性中的變量名。
expr 該form item變量的初始值,它默認為ECMAScript的undefined。如果給它賦一個初始值,則該form item就不會被訪問,除非該form item變量被清零。
cond ECMAScript表達式。只有當其結果值為boolean true,該元素才被執行,否則不被執行。缺省時為true。
namelist 要提交的變量名列表,默認是提交0個變量。如果指定了該屬性,它可以包含多個變量,以空格隔開。在VoiceXML和ECMAScript中聲明的變量都可以被提交。
src 要調用的subdialog的URI。
srcexpr ECMAScript表達式,它的結果值為要調用的subdialog的URI。
method 見5.3.8節。
enctype 見5.3.8節。
fetchaudio 見6.1節。它默認為<property>的fetchaudio的值。
fetchhint 見6.1節。它默認為<property>的documentfetchhint的值。
fetchtimeout 見6.1節。它默認為<property>的fetchtimeout的值。
maxage 見6.1節。它默認為<property>的documentmaxage的值。
maxstale 見6.1節。它默認為<property>的documentmaxstale的值。
表14:<subdialog>元素的屬性
????必須正確的指定屬性src和srcexpr中的一個,否則,要拋出一個error.badfetch事件。
????<subdialog>元素不但可以包含所有form item可包含的元素,還可以包含<param>元素。<subdialog>元素的<param>元素指定了要傳給subdialog的參數,這些參數必須在subdialog中用<var>元素聲明。試圖用<param>元素給一個form item變量或未聲明的變量賦值,會產生一個語義錯誤。當subdialog初始化時,它的變量按照文檔順序被依次初始化為<param>元素中相應的變量的值。在<param>元素的環境中,通過對它的屬性expr求值來得到參數值。在這種情況下,<var>元素的expr屬性被忽略。如果<var>元素聲明的變量沒有相應的<param>元素配對時,則它的expr屬性值被作為該變量的默認值,或者該變量為undefined(如果該<var>元素沒有指定expr屬性)。
????在下面的例子中,個人的生日用于驗證他們的駕駛執照。<subdialog>元素的src指定了同一個文檔中的另一個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>
????該例子返回了駕駛執照的值和用于表明執照是否非法的狀態變量給調用的dialog。
????該例子說明了使用<param>元素傳遞數據給subdialog的方便性,而不需要使用服務器端的腳本編程。下面這個例子使用了服務器端的腳本編程,它的效果和上面的例子是一樣的:
????調用一個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產生)
      <?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>
????在上面的例子中,一段服務器端腳本執行后產生了該文檔,并把生日嵌入到代文檔中。
????下面的例子的作用是使用一個subdialog收集信用卡信息,該subdialog在一個單獨的文檔中。它可在不同的應用中重用。它返回了狀態、信用卡號和過期時間。如果得不到結果,返回狀態值為“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>
????下面是一個應用,它包含有一個調用dialog。該應用通過混合主動式dialog獲得軟件名和操作系統名,然戶調用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應用程序中通過<object>元素,VoiceXML的執行平臺可以擴展依賴于平臺的一些功能。在初始化和執行期間,<object>元素直接使用他自己的內容(例如它的<param>子元素)。因此,不能認為<object>元素的內容是可有可無的。注意,和其他的field item一樣,<object>元素也有<prompt>元素和<catch>元素,它也可以有<filled>操作。
????例如,能像上面的例子一樣訪問一個依賴于平臺的用來收集信用卡信息的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>
????在這個例子中,當object被調用時,<param>元素用于傳遞參數。<object>元素執行后返回一個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>
????在下面這個例子中,假設平臺有一個object,該object可以讓用戶通過電話鍵盤輸入任意的文本信息。
      <?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>
????用戶首先聽到一些提示語,然后按鍵輸入信息。在<block>元素中把用戶輸入的信息賦給變量document.pager_message。
????<object>元素的屬性:
name 當該<object>元素執行時,該form item變量被置為一個ECMAScript object類型的值。
expr 該form item變量的初始值,默認為ECMAScript的undefined。如果它的值不為ECMAScript的undefined,則它將不會被訪問,除非該form item變量被清零。
cond ECMAScript 表達式。只有當其結果值為boolean true,該form item塊才被執行,否則不被訪問。缺省時為true。
classid 一個URI,它指定了要執行的object的位置。該URI的拼寫規則是依賴于平臺的。
codebase 基路徑,用于解析classid、data和archive屬性指定的相對URI。它默認為當前文檔的基礎URI。
codetype 下載classid指定的object時期望的數據類型。如果沒有指定,默認為屬性type的值。
data 指定object數據的位置的URI。如果它是一個相對的URI,則以codebase屬性指定的值為基路徑。
type Data屬性指定的數據的類型。
archive 一組和該object有關的檔案的URI,由空格隔開。這些檔案包含了classid和data屬性指定的數據。如果這些URI是一個相對的URI,則以codebase屬性指定的值為基路徑。
fetchhint 見6.1節。它默認為<property>的documentfetchhint的值。
fetchtimeout 見6.1節。它默認為<property>的fetchtimeout的值。
maxage 見6.1節。它默認為<property>的documentmaxage的值。
maxstale 見6.1節。它默認為<property>的documentmaxstale的值。
表15:<object>元素的屬性
????沒有必要提供依賴于平臺的object,如果基于特定平臺的object不支持,將拋出error.unsupported.objectname事件。如果做到了這一點,就可以認為是支持<object>元素了。
????Object自己負責檢查它收到的參數名或參數值是否非法。如果是非法的話,<object>元素拋出一個錯誤。該錯誤可以是依賴于object的,也可以是5.2.6節中列出的標準錯誤之一。
?
六、RECORD
????<record>元素是一個input item,用于收集用戶的錄音。該input item變量保存了錄制的音頻的引用。它能被播放(使用<audio>元素的expr屬性)或者提交給服務器,如下面的例子:
      <?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>元素的提示語,然后進行錄音。如果遇到如下的情況之一,就會終止錄音:達到final silence的條件,或者有DTMF按鍵輸入,或者達到最大的錄音時間,或者用戶掛機。該錄音被回放,如果用戶滿意,就用HTTP POST方法把它提交給服務器存儲。注意:和其他的input item一樣,<record>元素也有<grammar>、<prompt>和<catch>元素。它也可以有<filled>操作。
圖7: 提示語、音頻錄制和DTMF輸入的時間選擇
????當用戶在錄音時掛機,錄音終止并拋出connection.disconnect.hangup事件。然而,在用戶掛機之前所錄下來的音頻還是可用的,可通過<record>元素的form item變量引用。即使,在掛機之后,應用程序,例如下面這個簡單的語音郵件服務,還是能把該音頻數據返回給服務器:
      <?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>
????在播放完所有的提示語之后(如果有定義“beep”聲的話,也包括“beep”聲),錄音開始。作為一種優化,平臺可以在用戶開始說話的同時開始錄音。
????Timeout時間間隔在開始播放提示語時即生效,它的持續時間由timeout property決定。如果在開始錄音之前就已經超過了timeout的時間間隔,則拋出noinput事件。
????Maxtime時間間隔在開始錄音時生效,它的持續時間取決于該form item的maxtime屬性。如果在錄音結束之前就超過maxtime時間間隔,則錄音終止,且該form item的maxtime影子變量被置為true。
????當拋出一個事件,或者有DTMF(語音)輸入匹配了一個激活的語法,或者超過了maxtime時間間隔,錄音終止。最為一個最佳的選擇,平臺可以在達到一個靜音的時間間隔(由finalsilence屬性設置)后終止錄音,該靜音的時間間隔表示用戶已經停止輸入了。
????如果在執行<record>元素時,沒有收集到任何音頻,則該form item變量保持unfilled。例如,當在播放提示語的時候接收到DTMF或語音輸入,或達到timeout時間間隔(如果在播放提示語的時候,開發者想要一個輸入來初始化錄音,則<prompt>元素應緊接著放在<field>元素之后,且該<prompt>元素的timeout屬性值為0),就會出現這種情況。
????<record>元素包含了dtmfterm屬性,當它的值為true時,它的作用等同于定義了一個本地的DTMF語法,該語法匹配了所有的DTMF輸入。
????任何DTMF按鍵匹配了一個激活的語法就會終止錄音。DTMF按鍵沒有匹配一個激活的語法就會被忽略(因此不會終止錄音,也就是不會影響到錄音)且它的信號可以被平臺清除掉(可選的)。
????平臺在錄音的時候支持語音語法,這是可選的。如果平臺在錄音的同時支持語音識別,則錄音會被匹配一個激活的語音語法的語音輸入終止。終止錄音的語音輸入可通過application.lastresult$和該item的utterance和confidence影子變量訪問。用于識別終止錄音的語音輸入的音頻是不可用的,且它不是錄音的一部分。
????如果終止錄音時匹配的語法(DTMF或語音)是一個本地語法,該錄音存放在該form item變量中,否則該form item變量為unfilled且返回到FIA。無論是哪一種情況,application.lastresult$和該form item的影子變量都會被賦值。
????注意:在這種情況下雖然該form item變量沒有被錄音所填充,然而匹配一個非本地的語法可以導致給該form item變量賦某種值(詳見3.1.6節)。
????<record>元素的屬性有:
name 該input item變量保存了所錄制的音頻。注意,各個平臺實現該變量的方式可以是不同的(雖然該技術說明書中要求所有的平臺都必須在<audio>元素和<submit>元素中支持該變量的行為)值。
expr 該form item變量的初始值,它默認為ECMAScript的undefined 。如果給它賦一個初始值,則該form item就不會被訪問,除非該form item變量被清零。
cond ECMAScript表達式。只有當其結果值為boolean true,該元素才被執行,否則不被執行。缺省時為 true。
modal 如果該屬性值為true(默認值),在錄音時,所有非本地的語音和DTMF語法都會失效。若為false,則是激活的。
beep 當為true時,錄音前有“嘟”音提示。缺省值為 false。
maxtime 最長錄音時間。它是一個Time Designation (見6.5節)。默認為一個依賴于平臺的值。
finalsilence 表示錄音結束的靜音輸入時間。它是一個Time Designation (見6.5節)。默認為一個依賴于平臺的值。
dtmfterm 如果該屬性值為true,任何沒有匹配一個激活語法的DTMF按鍵被認為匹配了一個激活的(anonymous)本地DTMF語法。默認值為true。
type 表示所錄制的音頻的媒體格式。平臺必須支持附錄E中指定的聲音文件格式(也可以支持其他的格式)。默認為一個平臺指定的格式,該格式應該是不許支持的格式之一。
表16:<record>元素的屬性
????在錄音之后,<record>元素的影子變量也被賦值:
????下表是<field>元素的影子變量(shadow variables),該<field>的form item 變量名為name。影子變量utterance、 inputmode 和 interpretation的值必須和application.lastresult$ (詳見5.1.5節)中相應變量的值一樣。
name$.duration 錄音的持續時間,單位為毫秒。
name$.size 錄音的大小,單位為byte。
name$.termchar 如果該form item的dtmfterm屬性值為true,且用戶通過DTMF按鍵終止錄音,則該影子變量的值為用戶的按鍵(例如“#”),否則它的值為undefined。
name$.maxtime 如果是因為達到最大錄音時間而終止錄音,則該變量值為true,否則為false。
name$.utterance 如果是因為用戶在錄音時的語音輸入匹配了一個語法而終止了錄音,則該變量值為被匹配的字符串,否則它的值為undefined。
name$.confidence 當用戶在錄音時的語音輸入匹配了一個語法而終止了錄音,該變量值為被匹配的字符串的confidence級別(0.0-1.0)否則值為undefined。
表17:<record>元素的影子變量
?
七、TRANSFER
????<transfer>元素引導VoiceXML解釋器將主叫方連接到諸如電話、或其它語音應用程序。在轉接過程中,當前的解釋器進程處于等待狀態。
????有各種轉接方式,如:“bridge”、“blind”。還有基于網絡的轉接,如“switchhook transfer”。在VoiceXML解釋器中,只支持Bridge和Blind兩種方式的轉接類型。其它的依賴于指定的平臺和網絡特性,以及配置,這些內容超出了本規范的范圍。
????<Transfer>元素是可選的。支持<Transfer>的平臺應支持Bridge和Blind兩種Transfer類型。支持Bridge transfer的平臺在轉接通話過程中,對DTMF接收和語音識別的支持是可選的。
????<Transfer>元素的屬性:
name 在bridge方式下,保存轉接通話完成后的結果值。在blind方式下,這個變量的值是undefined。
expr Form item的初始值。缺省是ECMAScript undefined。如果初始化到一個值,這個元素將不被訪問。只有當這個Item的值被清除后才能被訪問。
cond 這是一個表達式,只有當它是true時,這個才form item可以被訪問。
dest 目標的URI地址(如:電話、IP電話地址)。VoiceXML平臺必須支持tel:URL語法格式(這種語法格式在[RFC2806]中描述),也可以支持其它基于URI地址格式。
destexpr ECMAScript表達式,它生成URI地址。
bridge 決定平臺在<transfer>執行后,是否依然監控主叫方和被叫方。
trueBridge transfer:VoiceXML解釋器一直處于等待狀態,直到Transfer從轉接通話狀態下退出。如果因為掛機或網絡的原因而線路中斷,會拋出一個Connection.disconnect.hangup事件。如果通話因為其它原因而中斷,中斷原因會寫在元素的屬性里。
falseBlind transfer(default):VoiceXML解釋器在完成轉接后,不再監控轉接過程,也不再在元素的名字屬性中報告掛斷結果,而是立即拋出一個connection.disconnect.transfer事件。

connectiontimeout 在電話轉接過程中,VoiceXML解釋器在noanswer事件出現前能夠等待的時間。這一屬性只有在bridge是true時才有效。在缺省情況下,這個值是平臺指定的。
maxtime 允許通話的最大時間。0表示沒有時間限制。只有當bridge是true時才有效。缺省情況下,這個值是0。
transferaudio 在轉接而對方沒有應答前,用來放音的語音URI地址。如果語音沒有取到,錯誤將被忽略,轉接繼續進行。
aai 應用程序之間用來交換的串信息。它可以在進程變量session.connection.aai中得到。aai數據的傳輸依賴于網關或ISDN、SIP。數據發送到遠端是否成功,并沒有報告。雖然所有的平臺必須支持aai屬性,平臺不一定非要發送aai和接收aai數據。如果平臺不能接收aai數據,必須將session.connection.aai變量置為ECMAScript undefined。
destexpr ECMAScript表達式,它生成URI地址。
表18:<transfer>元素的屬性
????“dest”和“destexpr”必須指定其一。如果兩者都沒有指定,error.badfetch事件就會拋出。“aai”和“aai”事件也必須指定其一,不然,error.badfetch事件也產生。
?
????<一>、Blind Transfer
????Blind Transfer是用來將主、被叫聯結起來的操作。在元素<transfer>前和在元素<transfer>內的<prompt>語句都會在轉接開始前依次播放,而且同樣具有bargein屬性。
圖8: 在Blind Transfer下的聯結: <transfer bridge="false">
????因為在轉接過程中聲音文件不能播放給主叫,所以transferaudio屬性指定的語音文件在轉接過程中被忽略。不管轉接是否成功,VoiceXML語音平臺不能再獲得對呼入和轉接電話的控制權。
????轉接的狀態不能得到。例如,不可能知道被叫是不是忙,這次呼叫是否成功等等。然而,有些錯誤是可以得到的,如主叫無權呼叫被叫方或者目標地址URI是錯誤的。
????一旦轉接開始,VoiceXML解釋器與電話進程脫離聯系,平臺將拋出一個connection.disconnect.transfer錯誤,解釋器還會繼續運行。
Action Form item變量的值 事件或錯誤 原因
轉接開始 undefined connection.disconnect.transfer 轉接進行,但不會返回。
轉接結束 unknown ? 轉接結束,但結果未知。
表19:Blind Transfer Outcomes
?
????<二>、Bridge Transfer
????對于Bridge Transfer,主叫和被叫是以全雙工方式進行的。
圖9: bridge transfer下的電話轉接:<transfer bridge="true">
????在<transfer>語句前和在<transfer>語句內的提示語音會依次播放,bargein也是有效的。
?
??????1、Listening for user input during a transfer
??????在<transfer>元素中可以指定一個或多個語法,這樣在通話過程中,就可以監視用戶的輸入而中斷轉接。
??????可以指定兩種輸入:
????????·DTMF輸入;
????????·語音輸入。
??????如果用戶的輸入匹配了所指定的語法,VoiceXML解釋器將繼續按照VoiceXML文本所指定的操作運行。如果沒有指定語法文件,在轉接過程中,將不監控用戶的輸入。Bargein屬性同樣適用于元素<transfer>前和元素<transfer>內的語音提示。此時,外呼開始;Transferaudio所指定的語音播放開始;語法文件所指定的DTMF或語音識別成為Bargein的唯一方式(直到對遠端的聯結建立)。因此bargeintype被忽略。轉接元素是模式的,因為在其作用域之外的語法沒有激活。
??????平臺解釋器沒有監控被叫的輸入。
?
??????2、Handling caller, callee, or network disconnections
??????當試圖去聯結被叫,平臺監控呼叫進程指示器(in bound或out of bound,依賴于特殊的聯結類型和協議)。在成功的轉接期間,平臺監控(out of band)電話事件,如電話的掛機事件。
??????如果被叫掛斷,主叫重新繼續它的任務。如果主叫掛斷,平臺掛斷被叫。主叫或被叫掛斷或兩者同時掛斷都不影響平臺解釋器的運行。
??????在轉接到被叫前,可能的結果如下:
Action Form item變量的值 事件或錯誤 原因
主叫掛斷 ? connection.disconnect.hangup 主叫掛機。
被叫忙 busy ? 被叫忙。
網絡忙 Network_busy ? 中間網絡不應答。
被叫沒有應答 noanswer ? 在connecttimeout屬性指定的時間內沒有應答。
---- unknown ? 轉接結束但結果未知。
表20:Bridged Transfer Outcomes Prior to Connection Being Established
??????轉接后可能的結果:
Action Form item變量的值 事件或錯誤 原因
主叫掛斷 ? connection.disconnect.hangup 主叫掛斷。
主叫掛斷 near_end_disconnect ? 主叫通過DTMF或語音強迫被叫掛機。
平臺掛斷被叫 maxtime_disconnect ? 因為最大的通話時間到達,平臺掛斷被叫。
網絡掛斷 network_disconnect ? 網絡掛斷被叫。
被叫掛斷 far_end_disconnect ? 被叫掛斷。
---- unknown ? 轉接因未知原因而中斷。
表21:Bridged Transfer Outcomes After Connection Established
??????在轉接完成后,元素<transfer>的影子變量有如下ECAMScript屬性:
name$.duration 轉接通話時間(浮點值),如果在被叫回答前就被掛斷,此值為零。
name$.inputmode 中斷轉接過程的輸入模式(voice或dtmf)。
name$.utterance 如果轉接因語音而中斷,此值中應是說出的文本;否則沒有定義。
表22:<transfer>元素的影子變量
?
??????3、Audio during bridge transfer attempt
??????在Bridge transfer過程中,也許要對主叫播放語音。例如一個廣告(“Buy Joe's Spicy Shrimp Sauce”)或一個信息(“Your call is very important to us; please wait while we connect you to the next available agent.”)。這樣便可以對呼叫進程中振鈴、忙等情況而出現的靜音起一個補償作用。
??????當遠端的應答出現時,Transferaudio的播放中止。遠端的應答不會永遠出現的,因為遠端交換機可以播放語音而不回答呼叫(這些語音包括一個特殊的音調、忙音、網絡忙音、或者一個提示聯結不能進行的錄音)。
??????如果一個語音播放的時間短于轉接到遠端的所需的時間,主叫也許會聽到靜音、平臺所指定的語音、或者是呼叫進行過程中的信息。具體是何種語音依賴于不同的平臺。
?
????<三>、Transfer Errors and Events
事件 原因 轉接類型
connection.disconnect.hangup 主叫掛機。 bridge
connection.disconnect.transfer 將主叫轉接到另一方,而且返回。 blind
表23:Events Thrown During Transfer
????如果transfer不能進行,下列錯誤將會拋出:
錯誤 原因 轉接類型
error.connection.noauthorization 主叫不允許呼叫目標。 Blind和Bridge
error.connection.baddestination 目標URI錯誤。 Blind和Bridge
error.connection.noroute 平臺不能對目標呼叫 bridge
error.connection.noresource 平臺不能分配資源而不能呼叫。 bridge
error.connection.protocol.nnn 協議棧在聯結中出現一個例外,此例外不能對應于任何一個error.connection事件。 bridge
error.unsupported.transfer.blind 平臺不能支持Blind轉接。 blind
error.unsupported.transfer.bridge 平臺不能支持Bridge轉接。 bridge
error.unsupported.uri 平臺不能支持用到的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
????下面的例子試圖將主叫轉接到另一方,并等待通話的結束。語音提示可能在元素<transfer>前或內部。這也許用來通知主叫,發生了什么事情。這種通知通常是“請等待,正在轉接呼叫”。在<block>、<transfer>中的<prompt>元素,在執行轉接前,依次播放。語音隊列開始播放,呼叫便開始。在缺省情況下,主叫聯結到外呼的電話通道。“transferaudio”屬性指定對主叫播放的語音文件,它會在遠端應答時停止播放。如果語音的長度大于聯結所需的時間,只要遠端應答,也會停止播放。
圖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>
?

第四節 Filled?
?
????<filled>元素指定了當一個或多個input item被填充后要執行的操作。它可以出現在兩個地方:作為<form>元素的子元素,或者作為input item的子元素。
????如果作為<form>元素的子元素,當一個或多個input item的組合被填充后,<filled>元素用于執行一些操作。下面的例子中的<filled>元素用于交叉檢查以確保“start_city” <field>和“end_city”<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 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>作為一個input item的子元素出現,它指定了當該input item被填充后要執行的操作:
      <?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都被做了標記,然后解釋器根據每個<filled>元素在文檔中的順序(input item中的<filled>元素和<form>中的<filled>元素優先權一樣)依次訪問它們。那些匹配該utterance的<filled>元素被依次執行,除非已經沒有<filled>元素,或者出現控制跳轉,或者拋出事件。
????<filled>元素的屬性有:
mode值為all(默認)或any。如果值為any,當任意一個指定的input item被用戶最近一次的輸入填充后,就執行該<filled>元素的操作。如果值為all,當所有提到的input item被填充,且用戶最后一次輸入填充了至少一個input item,就執行該<filled>元素的操作。在input item中的<filled>元素不能指定該屬性。
namelist要觸發的input item。對于<form>元素中的<filled>元素,該屬性默認為該form中所有的input item變量(包括顯式和隱式)。一個input item中的<filled>元素則不能指定該屬性,這種情況下,namelist屬性值實際上就是該input item的名稱。注意control item不能出現在該屬性中。
表25:<filled>元素的屬性

第五節 Links?
?
????<link>元素可以有一個或幾個語法,語法的作用域為包含該<link>元素的元素。該包含<link>元素的元素的scope屬性不會影響<link>元素中語法的作用域。<link>元素被包含于一個<form>元素中,該<form>元素的scope屬性為document,該<link>元素語法的作用域在該form內,而不是整個文檔。<link>元素中的<grammar>元素是不允許指定scope屬性的。當這些語法中的一個被匹配,<link>元素被激活,要么跳轉到一個新的文檔或dialog(如<goto>),要么拋出一個事件(如<throw>)。
????例如,當用戶說“books”或按“2”時,<link>元素被激活:
      <link next="http://www.voicexml.org/books/main.vxml">
        <grammar mode="voice" version="1.0" root="root">
           <rule id="root" scope="public">
              <one-of>
                <item>books</item>
                <item>VoiceXML books</item>
              <one-of>
           </rule>
         </grammar>
         <grammar mode="dtmf" version="1.0" root="r2">
           <rule id="r2" scope="public"> 2 </rule>
        </grammar>
      </link>
????當語法被匹配時,下面的<link>元素動態的決定要跳轉到當前文檔的哪一個dialog:
      <link expr="'#' + document.helpstate">
        <grammar mode="voice" version="1.0" root="root">
           <rule id="root" scope="public"> help </rule>
        </grammar>
      </link>
????<link>元素可以是<vxml>和<form>的子元素,或form item<field>和<initial>的子元素。作為<vxml>的子元素,<link>元素的語法在整個文檔中都是激活的;作為<form>的子元素,<link>元素的語法在該form中是激活的;如果應用根文檔中有一個文檔級的<link>元素,它的語法在該應用所有被加載的文檔中都是激活的。
????如果在一個form item中執行,且該form item的modal屬性為true,則form級或文檔級的<link>元素的語法是不激活的。
????也可以定義一個<link>元素,當語法匹配時拋出一個事件,而不是跳轉到一個新的文檔或dialog,該事件是在當前執行的地方被拋出,而不是在定義<link>元素的地方被拋出。例如,當用戶的輸入匹配了<link>元素的語法或用戶按鍵輸入了"2",在用戶正在訪問的form item的地方拋出了help事件,由該form item的作用域內相應的<catch>元素處理(詳見5.2.4節)。
      <link dtmf="2" event="help">
        <grammar mode="voice" version="1.0" root="r5">
           <rule id="r5" scope="public">
              <one-of>
                <item>arrgh</item>
                <item>alas all is lost</item>
                <item>fie ye froward machine</item>
                <item>I don't get it</item>
              <one-of>
           </rule>
        </grammar>
      </link>
????當匹配了<link>元素中的語法時,application.lastresult$也被賦值,這樣才能允許呼叫流程在這個實際的語義結果的基礎上往下走。在5.1.5中有一個例子。
????從概念上講,可以認為<link>元素由兩部分組成:條件和操作。“條件”就是<link>元素的內容,即它的語法,只有語法被匹配了,才能激活。“操作”由該元素的屬性指定,即要跳轉到哪里或拋出哪個事件。“條件”是靜態地解決/求值的,而“操作”則是動態地解決/求值的。這意味著:
??????1、該<link>元素的內容中的任何URI都是被靜態地求值的,即根據定義了<link>元素的文檔的基本URI求值(詳見1.5.1節的xml:base)。
??????2、<link>元素屬性中的任何URI都是被動態的求值的,即根據語法被匹配時正在執行的文檔的基本URI求值。
??????3、<link>元素的屬性中的任何ECMAScript表達式都是被動態地求值的,即在語法被匹配時的作用域內和執行的環境中求值的。
????<link>元素的屬性有:
next要跳轉到的URI,該URI是一個文檔(也許有段標識符指定一個起始的dialog)或當前文檔的一個dialog。
expr和next屬性一樣,只不過該URI是根據給定的ECMAScript表達式動態地求值的。
event當用戶匹配了<link>元素中的一個語法時要拋出的事件。
eventexpr一個ECMAScript表達式,它的結果值為當用戶匹配了<link>元素中的一個語法時要拋出的事件。
message描述事件產生原因的文本信息。
messageexpr一個ECMAScript表達式,它的結果值為描述事件產生原因的文本信息。
dtmf該<link>元素的DTMF序列,它的作用等同于一個簡單的DTMF語法,和應用于該序列識別的DTMF<property>。它和DTMF語法不同的是,它的空格是不起作用的:dtmf=“123#”跟dtmf=“1 2 3 #”的效果是一樣的。該屬性能和其他的<grammar>同時使用。當用戶的輸入匹配了<link>元素中的一個語法或DTMF序列,該<link>元素被 激活。
fetchaudio見6.1節。它默認為fetchaudio<property>的值。
fetchhint見6.1節。它默認為documentfetchhint<property>的值。
fetchtimeout見6.1節。它默認為fetchtimeout<property>的值。
maxage見6.1節。它默認為documentmaxage<property>的值。
maxstale見6.1節。它默認為documentmaxstale<property>的值。
表26:<link>元素的屬性
????必須正確的指定屬性“next”,“expr”,“event”或“eventexpr”中的一個,否則會拋出一個error.badfetch事件。必須正確的指定屬性“message”或“messageexpr”中的一個,否則會拋出一個error.badfetch事件。
?


posted on 2006-09-16 21:42 鐵觀音 閱讀(2493) 評論(0)  編輯 收藏 引用 所屬分類: VoiceXML2.0規范
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产深夜精品| 久久久久.com| 国产精品日本欧美一区二区三区| 夜夜爽av福利精品导航| 国产亚洲精品一区二555| 9久re热视频在线精品| 欧美午夜视频| 午夜精品美女久久久久av福利| 欧美黄色免费网站| 欧美日韩中文字幕日韩欧美| 亚洲激情视频在线| 欧美日韩午夜在线| 亚洲高清在线观看| 欧美激情精品久久久久久大尺度 | 中文精品视频| 亚洲欧美视频在线| 亚洲精品日韩欧美| 亚洲一区二区在线免费观看| 国产麻豆91精品| 久久综合久色欧美综合狠狠| 国产一区二区电影在线观看| 国产欧美在线播放| 国产精品视频免费观看| 国产欧美一区二区精品仙草咪| 亚洲丰满在线| 国产精品久久久久aaaa樱花| 在线观看91久久久久久| 99国产精品久久久久久久成人热| 欧美怡红院视频一区二区三区| 欧美一区免费| 久久久av网站| 午夜精品一区二区三区在线播放| 欧美成熟视频| 在线视频欧美日韩| 久久夜色精品国产| 欧美—级a级欧美特级ar全黄| 国产啪精品视频| 国产亚洲欧美日韩一区二区| 国产一区二区三区四区| 亚洲精品一区二区三区99| 一本色道久久综合狠狠躁的推荐| 午夜性色一区二区三区免费视频| 亚洲欧洲日本专区| 欧美电影打屁股sp| 99pao成人国产永久免费视频| 亚洲影视九九影院在线观看| 久久久久久高潮国产精品视| 亚洲人成人一区二区在线观看| 亚洲国产一区二区三区高清| 午夜精品视频一区| 欧美日韩国产高清| 亚洲国产欧美日韩精品| 午夜精品视频在线观看一区二区| 欧美福利视频在线| 欧美日一区二区在线观看| 欧美色图一区二区三区| 国产精品久久久一本精品| 亚洲精品美女在线观看| 久久er99精品| 一区二区三区.www| 欧美精品aa| 亚洲国产日韩欧美综合久久| 欧美在线网站| 一本久道久久久| 欧美成人精品h版在线观看| 亚洲男女自偷自拍图片另类| 美女亚洲精品| 精品动漫一区二区| 久久久久久噜噜噜久久久精品| 在线一区二区日韩| 欧美性一区二区| 亚洲一区二区三区成人在线视频精品| 欧美国产欧美综合| 欧美大片在线看免费观看| 亚洲高清免费在线| 美女精品在线观看| 久久亚洲综合色一区二区三区| 国产日韩一区二区三区| 欧美一区二区三区视频免费| 亚洲一区精彩视频| 国产伦精品一区二区三区在线观看 | 亚洲精品一区二区三区不| 久热精品视频在线| 亚洲二区精品| 亚洲国产第一页| 欧美电影免费观看高清| 日韩系列欧美系列| 亚洲美女在线一区| 欧美午夜不卡| 欧美一区二区三区在线| 欧美在线电影| 亚洲国产天堂久久综合| 欧美成人高清| 欧美激情第1页| 亚洲级视频在线观看免费1级| 亚洲精品中文字幕在线| 欧美电影在线观看| 亚洲小视频在线| 亚洲欧美日韩久久精品| 国内精品一区二区三区| 免费久久99精品国产自在现线| 美女成人午夜| 亚洲一区免费看| 久久黄色影院| 亚洲激情国产| 亚洲激情国产| 欧美视频1区| 欧美在线观看视频一区二区| 国产一区二区三区高清| 欧美成人在线免费视频| 亚洲欧美日韩在线不卡| 黄色精品一二区| 亚洲先锋成人| 久久久精品视频成人| 亚洲国产成人av| 亚洲麻豆av| 国产区日韩欧美| 看欧美日韩国产| 欧美日韩高清在线观看| 久久亚洲不卡| 欧美午夜精品久久久久久超碰| 亚洲一区二区欧美| 欧美成人一区二区在线| 亚洲先锋成人| 欧美激情综合五月色丁香| 亚洲午夜一区二区| 久久精品国产久精国产爱| 亚洲午夜精品久久| 久久久久久久999精品视频| 午夜免费日韩视频| 亚洲精品九九| 久久黄色小说| 欧美一区日韩一区| 欧美精品激情blacked18| 久久成人18免费网站| 欧美福利一区| 亚洲免费一在线| 女生裸体视频一区二区三区| 亚洲主播在线观看| 欧美激情一区| 久久免费视频一区| 欧美日韩高清在线播放| 免费不卡中文字幕视频| 欧美日韩综合久久| 欧美国产一区二区在线观看| 亚洲影视在线| 国产精品99免费看| 亚洲国内精品在线| 亚洲黄色影院| 久久婷婷激情| 欧美在线视频网站| 一本色道久久精品| 欧美精品福利| 亚洲国产成人精品久久久国产成人一区 | 久久不射中文字幕| 久久深夜福利免费观看| 久久精品亚洲一区二区三区浴池| 欧美日韩成人综合| 亚洲黄色性网站| 在线观看视频日韩| 久久久久久久91| 久久综合九色欧美综合狠狠| 国产综合网站| 久久免费黄色| 欧美国产欧美综合| 99re66热这里只有精品3直播| 欧美国产先锋| 国产精品激情偷乱一区二区∴| 亚洲视频在线观看网站| 一区二区三区回区在观看免费视频| 久久另类ts人妖一区二区| 欧美一区二区免费观在线| 欧美一区二区免费| 国产精品福利影院| 日韩视频精品| 99在线精品视频在线观看| 欧美成人午夜视频| 艳女tv在线观看国产一区| 亚洲一区二区三区视频| 国产精品色网| 久久久久国产精品一区三寸| 久久久水蜜桃| 亚洲国产日韩在线| 欧美日韩中文字幕在线视频| 午夜精品久久久久久99热软件| 久久亚洲国产精品日日av夜夜| 日韩一级大片在线| 国产精品视频午夜| 久久综合999| 在线亚洲欧美| 男女av一区三区二区色多| 狠狠色狠狠色综合人人| 蜜臀av一级做a爰片久久| 亚洲美女电影在线| 久久久噜久噜久久综合| 99在线精品观看| 在线成人小视频| 欧美日韩激情小视频| 欧美一级理论片| 亚洲三级电影在线观看|