第三節 Executable Content
|
? |
? |
????可執行內容指的是一段程序邏輯。例如出現在 |
|
??????·form item <block>元素中; |
|
??????·<form>元素或input item的<filled>元素中; |
|
??????·事件處理中(<catch>,<help>元素等)。 |
|
????可執行元素按照它們的文檔順序被依次執行。如果某個可執行元素產生一個錯誤,則這個錯誤馬上被拋出。其后的可執行元素就不會被執行了。 |
|
????這一節描述的是出現在可執行內容中的元素。 |
? |
一、VAR |
|
????<var>元素用于聲明一個變量。它可以出現在任何可執行的內容中,也可以作為<form>元素或<vxml>元素的子元素出現。例如: |
|
<var name="phone" expr="'6305551212'"/>
<var name="y" expr="document.z+1"/>
|
|
????如果它出現在可執行的內容中,它聲明的變量作用域為anonynous,且作用在包含它的<block>,<filled>或<catch>元素中。在這種情況下,只有<var>元素被執行的時候才聲明該變量。如果該變量在這個作用域已經聲明了,則其后的聲明將被看作是賦值,就像在ECMAScript中一樣。 |
|
????如果<var>元素作為<form>元素的子元素出現,則它聲明的變量的作用域為該form的dialog。在這種情況下,在該form的初始化階段就進行變量聲明(詳見2.1.6.1節)。<var>元素不是一個form item,因此,它不能被FIA的主循環訪問。 |
|
????如果<var>元素作為<vxml>元素的子元素出現,它聲明的變量的作用域為document;如果該文檔是應用根文檔,它聲明的變量的作用域為application。當文檔被初始化的時候就進行變量聲明,且初始化是按照文檔的順序進行的。 |
|
????它的屬性有: |
name |
保存變量值的變量名。 |
expr |
該變量的初始值(可選的)。如果沒有指定該屬性,該變量保持它當前的值(如果它當前有值的話);如果沒有給定初始值,變量初始值默認為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對象已經被正確地初始化(例如“obj”),則它的屬性(例如“obj.prop1”)沒有顯式聲明就可以給它賦值(實際上,如果試圖聲明ECMAScript對象的屬性,如聲明“obj.prop1”平臺會拋出error.semantic事件)。 |
|
????<assign>元素的屬性: |
name |
要被賦值的變量名。 |
expr |
要賦給該變量的值。 |
|
表45:<assign>元素的屬性 |
? |
三、CLEAR |
|
????<clear>元素的作用是重置(清零)一個或多個變量,包括form item。重置form item包括以下的操作: |
|
??????1、把該form item變量置為ECMAScript的undefined。 |
|
??????2、重新初始化該form item的提示語計數器和事件計數器。 |
|
????例如: |
|
<clear namelist="city state zip"/>
|
????它的屬性有: |
namelist |
要重置的變量清單,它除了可以包括form item也可以包括變量名。如果沒有指定,當前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>元素的一般形式出現在可執行內容中,除非不使用<prompt>元素的count屬性。特別的,它的cond屬性也可用在可執行內容中。提示語可以被封裝在<prompt>和</prompt>中,或使用PCDATA表示。只要是<prompt>元素允許出現的地方,使用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 |
|
????在處理一個事件的過程中,FIA需要一個<catch>元素對適當的提示語進行排隊。因此,在執行完一個<catch>元素后的下一次循環中,FIA一般不會進行正常的選定和提示語排隊。然而,有兩種情況下,FIA在執行完一個<catch>元素后的下一次循環中,會進行正常的選定和提示語排隊: |
|
??????1、如果在<catch>元素中執行了<goto>元素或<submit>元素,跳轉到另一個dialog,或者執行了一個<return>元素,從一個subdialog中返回,在這些情況下,新的dialog需要保證它的初始提示語保持原樣; |
|
??????2、如果在<catch>元素中執行了一個<reprompt>元素,要求FIA隨后要重新播放提示語。 |
|
????在這兩種情況中,FIA選定下一個要訪問的form item之后,會執行正常的提示語處理,包括選定該form item的提示語,對提示語進行排隊,和給該form item的提示語計數器加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>元素,上面的流程變為如下所示: |
|
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.
|
|
????注意,上面的例子中之所以略過了提示語選擇階段,是因為在執行完一個<catch>元素后(沒有執行<reprompt>元素,或沒有通過<goto>、<submit>、<return>元素跳轉到另一個dialog),被FIA選定的該form item的提示語計數器并沒有加1。 |
|
????同時注意,執行一個<catch>元素后(沒有執行<reprompt>元素,或沒有通過<goto>、<submit>、<return>元素跳轉到另一個dialog),FIA選定的下一個要訪問的form item的提示語選定階段也會被略過,即使該form item和前一個被選定的form item不是同一個。 |
|
????<reprompt>元素在<catch>元素之外是不會起作用的。 |
? |
七、GOTO |
|
????<goto>元素用于: |
|
??????1、跳轉到當前form的另一個form item; |
|
??????2、跳轉到當前文檔的另一個dialog; |
|
??????3、跳轉到另一個文檔。 |
|
????要跳轉到另一個form item,使用next屬性,或使用expritem屬性,如果該form item名可以通過ECMAScript表達式計算得到的話: |
|
<goto nextitem="ssn_confirm"/>
<goto expritem="(type==12)? 'ssn_confirm' : 'reject'"/>
|
|
????要跳轉到同一個文檔的另一個dialog,使用next屬性,或使用expr屬性指定一個URI段: |
|
<goto next="#another_dialog"/>
<goto expr="'#' + 'another_dialog'"/>
|
|
????要跳轉到另一個文檔使用next屬性,或使用expr屬性指定一個URI: |
|
<goto next="http://flight.example.com/reserve_seat"/>
<goto next="./special_lunch#wants_vegan"/>
|
|
????URI可以是當前文檔的絕對或相對的URI。要指定下一個文檔開始的dialog,可以使用對應于該dialog的id屬性值的URI段。如果沒有指定URI段,則以要跳轉到的文檔的第一個dialog為開始的dialog。 |
|
????注意,跳轉到當前文檔的另一個dialog會導致舊的dialog變量丟失,即使是一個dialog跳轉到它自己也會丟失。同樣的,使用相對或絕對的URI跳轉到另一個文檔,也會丟失文檔變量,即使是一個文檔跳轉到它自己也會丟失。然而,當跳轉到一個帶有段標識符的空的URI引用時,文檔變量不會丟失。例如下面兩個語句在URI為http://someco.example.com/index.vxml的文檔中有不同的行為: |
|
<goto next="#foo"/>
<goto next="http://someco.example.com/index.vxml#foo"/>
|
|
????根據RFC2396,段標識符(“#”后面的部分)不是URI的一部分,到一個空的URI引用加上段標識符的跳轉永遠都不會獲取到一個新的文檔。因此,第一條語句中的“#foo”時一個帶有段標識符的空的URI引用,它的文檔變量不會丟失。在第二條語句中,“#foo”是一個絕對URI的一部分,該跳轉會導致文檔變量的丟失。如果想要在多文檔中保存數據,請把數據保存在應用根文檔中。 |
|
????在<goto>元素的next或expr屬性中,URI引用(詳見RFC2396)指定要跳轉到的dialog,如果這個URI引用包含一個絕對或相對的URI,該URI可以包含一個查詢串,則FIA獲取該URI,并且在目標文檔中尋找相應的dialog。 |
|
????如果該URI引用只包含一個段(即沒有絕對或相對的URI),則沒有任何文檔被獲取,FIA在當前文檔中尋找相應的dialog。 |
|
????URI引用中的段,如果有的話,以要跳轉到的dialog命名,如果URI引用中沒有段,則選定目標文檔的第一個dialog。 |
|
????如果要跳轉到的form item、dialog或文檔不可用(即該form item、dialog或文檔不存在),必須拋出error.badfetch事件。注意,對于在dialog或文檔跳轉時出現錯誤,處理錯誤的作用域是依賴于平臺的;對于在form item之間跳轉時出現的錯誤,事件在dialog的作用域內處理。 |
|
????<goto>元素的屬性: |
next |
要跳轉到的URI。 |
expr |
一個ECMAScript表達式 ,其結果值為要跳轉到的URI。 |
nextitem |
當前form 中下一個要訪問的form item名。 |
expritem |
一個 ECMAScript表達式,其結果值為當前form中下一個要訪問的form item名。 |
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>。 |
|
表47:<goto>元素的屬性 |
|
????必須正確地指定屬性“next”、“expr”、“event”和“eventexpr”中的一個,否則會拋出error.badfetch事件。 |
? |
八、SUBMIT |
|
????<submit>元素用于提交信息給web服務器,然后跳轉到web服務器響應后返回的文檔。和<goto>元素不一樣的是,<submit>元素可以通過HTTP GET或POST請求提交一個變量列表到文檔服務器。例如可以提交一組form item變量到服務器: |
|
<submit next="log_request" method="post"
namelist="name rank serial_number"
fetchtimeout="100s" fetchaudio="audio/brahms2.wav"/>
|
|
????<submit>元素的next或expr屬性指定了要跳轉到的dialog。該URI每次都要被獲取,即使它只包含了一個段。在URI只包含一個段的情況下,請求的URI就是當前文檔的基本URI。因此,下面的兩個元素有完全不同的效果: |
|
<goto next="#get_pin"/>
<submit next="#get_pin"/>
|
|
????注意:雖然URI總是要被獲取,并且跳轉到目標文檔,但是通過緩存,還是能夠滿足某些<submit>元素請求的。例如,如果web服務器在響應時提供了一個顯式的過期時間,就可能發生這種情況。 |
|
????如果要跳轉到的dialog或文檔是非法的(即該dialog或文檔不存在),必須拋出一個error.badfetch事件。注意:對于那些在dialog或文檔跳轉時出現的錯誤,在哪個作用域內處理它們是依賴于平臺的。 |
|
????<submit>元素的屬性有: |
next |
要引用的URI。 |
expr |
ECMAScript表達式,它的結果值為要引用的URI。 |
namelist |
要提交的變量名列表。默認是提交所有有命名的input item。如果指定了namelist屬性,它可以包含一個或多個變量名,以空格隔開。在VoiceXML和ECMAScript中聲明的變量都能被提交。 |
method |
請求的方法:get(默認的)或post。 |
enctype |
被提交的文檔的媒體編碼類型,默認為application/x-www-form-urlencoded 。解釋器也必須支持multipart/form-data ,也可以支持其他的編碼類型。 |
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>。 |
|
表48:<submit>元素的屬性 |
|
????必須正確的指定屬性next或expr中的一個,否則會拋出error.badfetch事件。 |
|
????當一個ECMAScript變量被提交給服務器時,它先被轉換成一個字符串才被提交。VoiceXML目前還沒有定義一種提交ECMAScript對象的機制,將來會定義這種機制。一種變通的方法是,開發者可以顯式的提交對象的屬性,例如“date.month date.year”。 |
|
????如果<submit>元素包含的變量引用了一個錄制的音頻,但是沒有包含multipart/form-data的ENCTYPE的話,VoiceXML目前還沒有規定這種行為。試圖在URI中對大量的數據編碼顯然是不合實際的。 |
? |
九、EXIT |
|
????<exit>把控制返回給解釋器環境,由解釋器環境決定下一步做什么。 |
|
<exit/>
|
|
????該元素和<return>元素的不同之處在于它終止了所有加載的文檔,而<return>則是從一個<subdialog>調用中返回。如果<subdialog>調用了一個新的文檔(或應用),則<return>會終止被調用的文檔,控制返回到<subdialog>元素繼續執行。 |
|
????注意,一旦<exit>把控制返回給解釋器環境,解釋器環境就可以做它想做的操作。例如,它可以給用戶播放上一級<menu>元素中的提示語,或者掛機,或者把用戶轉接到人工坐席。 |
|
????它的屬性有: |
expr |
一個ECMAScript表達式,該表達式的值就是要返回的值(如“0”,“oops!”或“field1”)。 |
namelist |
要返回給解釋器環境的變量名清單。默認是返回0個變量,這樣意味著解釋器環境將接收到一個空的ECMAScript 對象。 |
|
表49:<exit>元素的屬性 |
|
????可以正確地指定屬性“expr”和“namelist”中的一個,否則,會拋出error.badfetch事件。 |
|
????<exit>元素不會拋出一個“exit”事件。 |
? |
十、RETURN |
|
????<return>元素用于結束一個subdialog的執行,并把控制和數據返回給調用它的dialog。 |
|
????它的屬性有: |
event |
要返回并拋出的事件。 |
eventexpr |
ECMAScript表達式。其結果值為拋出的事件。它的作用是從subdiaolog中返回,并拋出該事件 。 |
message |
有關被拋出的事件的信息。在<catch>元素中,可通過“_message”變量取得該信息,見5.2.2節。 |
messageexpr |
ECMAScript表達式。其結果值為有關被拋出的事件的信息。 |
namelist |
要返回的變量名。默認為返回0個變量,即調用該subdialog的dialog將得到一個空的ECMAScript 對象 。 |
|
表50:<return>元素的屬性 |
|
????可以正確的指定屬性“event”,“eventexpr”或“namelist”中的一個,否則會拋出一個error.badfetch事件。可以正確的指定屬性“message”或“messageexpr”中的一個,否則會拋出一個error.badfetch事件。 |
|
????當從一個subdialog中返回,一個事件在調用的地方被拋出,或者數據作為一個ECMAScript對象被返回,該對象的屬性對應于subdialog中的<return>元素的namelist屬性值。如果不是在subdialog中執行,卻碰到<return>元素,則會拋出一個語義錯誤。 |
|
????下面的例子展示了,當subdialog不能獲得一個可識別的結果時,一個nomatch事件通過subdialog在調用它的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事件處理在第三次匹配失敗時被觸發,然后從subdialog中返回,并在調用他的dialog中拋出該事件。在這種情況下,調用的dialog將執行它自己的nomatch事件處理,通過<goto>元素跳轉到另一個文檔,而不是執行<filled>操作。在一般的情況下,如果得到一個識別結果,就會執行該<subdialog>元素中的<filled>操作,該識別結果可通過result.ssn訪問。 |
? |
十一、DISCONNECT |
|
????它的作用是使解釋器環境斷開和用戶之間的鏈接,此時,解釋器環境將拋出connection.disconnect.hangup事件,它可以被捕獲,以做一些清除的處理。 |
|
<disconnect/>
|
? |
十二、SCRIPT |
|
????<script>元素允許在VoiceXML腳本中使用一段客戶端的腳本語言代碼,它和HTML的<SCRIPT>元素類似。例如下面的例子中<script>元素用于計算一個數的階乘: |
|
<?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>元素可以出現在<vxml>元素和<form>元素中,或者出現在可執行的內容中(如<filled>,<if>,<block>,<catch>或<catch>元素的快捷標記)。在文檔被裝載后,<vxml>元素中的<script>元素和<var>元素都按照它們的文檔順序被依次求值。每次執行到<form>元素,該form中的<script>元素和<var>元素及form item 變量也是按照它們的文檔順序被依次求值。和其他的可執行元素一樣,當在可執行的內容中碰到<script>元素時,都會執行它。 |
|
????<script>元素的屬性有: |
src |
如果腳本是外部的,則該屬性指定了該外部腳本的URI。 |
charset |
屬性src指定的腳本的字符編碼。平臺必須支持ISO/IEC 10646的UTF-8 和 UTF-16編碼,也可以支持其他的編碼,如IANA中定義的。默認為UTF-8。 |
fetchhint |
見6.1節。它默認為documentfetchhint <property>。 |
fetchtimeout |
見6.1節。它默認為fetchtimeout <property>。 |
maxage |
見6.1節。它默認為documentmaxage <property>。 |
maxstale |
見6.1節。它默認為documentmaxstale <property>。 |
|
表51:<script>元素的屬性 |
|
????必須指定一個src屬性或一個聯機腳本中的一個(不是兩個都指定),否則,會拋出error.badfetch事件。 |
|
????VoiceXML中的<script>元素沒有type屬性(這一點和HTML的<SCRIPT>元素不一樣),ECMAScript是VoiceXML必須的腳本語言。
|
|
????每個<script>元素在它的父元素的作用域內被執行,即它沒有自己的作用域。例如在<script>元素用var語句聲明的變量的作用域為該<script>元素的父元素(用ECMAScript的術語來說,就是"變量對象"為包含<script>元素的元素的當前作用域)。 |
|
????下面的例子中<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>元素的內容在和<var>元素一樣的作用域內被求值(見5.1.2和5.3.1節)。 |
|
????由于設置了ECMAScript的作用域鏈,因此,無論是<var>元素聲明的變量,還是在<script>元素中聲明的變量,它們的作用域都是包含該<var>元素或<script>元素的元素的作用域。例如,在<form>的<script>元素中聲明的變量的作用域為dialog,它能夠作為一個作用域為diaolog的變量被訪問: |
|
<?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節。 |
? |
十三、LOG |
|
????<log>元素讓應用程序可以產生日志或調試信息,這些信息能夠用來幫助開發者開發程序,或進行執行后的程序性能分析。 |
|
????<log>元素可以包含文本(CDATA)和<value>元素的任意組合,產生的信息由文本和<value>元素的cond屬性值串聯起來組成。 |
|
????信息的顯示和記錄方式是依賴于平臺的,lable屬性的用法也是依賴于平臺的。 |
|
????<log>元素中的ECMAScript表達式根據它們在文檔中的順序求值,使用<log>元素不應該對文檔的解釋產生任何的副作用。 |
|
<log>The card number was <value expr="card_num"/></log>
|
|
????<log>元素的屬性: |
label |
一個字符串,例如它可以用來表明該<log>元素的目的。 |
expr |
一個ECMAscript表達式,它的結果值為一個字符串。 |
|
表52:<log>元素的屬性 |