|
第三節(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>元素的屬性 |