実行可能内容(executable content)は、手続き的論理のブロックを参照する。そのようなロジックは次の場所に現れる:
この章では、実行可能内容において出現しうる要素について述べる。
この要素は変数を宣言する。これは実行可能内容においては<form>または<vxml>の子として発生しうる。
<var name="phone" expr="6305551212"/> <var name="y" expr="document.z+1"/>
実行可能内容において発生すれば、それは、<block>、<filled>、または、キャッチ要素と関連していた無名の有効範囲において変数を宣言する。<var>が実行されるときのみ、この宣言が行われる。その変数がこの有効範囲において既に宣言されるならば、次の宣言は、割当ての役割を果たすことになる(ECMAScriptと同様に)。
<var>が<form>の子供であるならば、それは、その<form>の対話有効範囲において変数を宣言する。6.6.1.章において示されたformの初期化フェーズの間に、この宣言が行われる。<var>は、フォーム項目ではない。従って、FIAのメインループによって訪れられない。<var>が<vxml>の子であるならば、それは、ドキュメント有効範囲において変数を宣言する。この宣言は、ドキュメントが初期化されるときに行われる;初期化は、ドキュメント中の出現順に行われる。
name | 結果を保持するであろう変数の名前。 |
expr | (任意の)変数の初期値。もしexpr属性がないならば、その変数は、その現在の値を保持する。変数は初期値を与えられないならば、ECMAScriptのundefined値によって初期化される。 |
<assign>は、値を変数に割り当てる:
<assign name="flavor" expr="'chocolate'"/> <assign name="document.mycost" expr="document.mycost+14"/>
属性は、以下を含む。
<clear>は、1以上のフォーム項目をリセットする。リセットは以下を含む。
例えば:
<clear namelist="city state zip"/>
その属性は、以下である。
<if>は、条件付の論理のために使われる。これは<else>と<elseif>のオプションを持つ。
<if cond="total > 1000"> <prompt> お金が足りません。 </prompt> <throw "com.xyzcorp.acct.toomuchspent"/> </if> <if cond="amount < 29.95"> <assign name="x" expr="amount"/> <else/> <assign name="x" expr="29.95"/> </if> <if cond="flavor == 'バニラ'"> <assign name="flavor_code" expr="'v'"/> <elseif cond="flavor == 'チョコレート'"/> <assign name="flavor_code" expr="'h'"/> <elseif cond="flavor == 'ストロベリー'"/> <assign name="flavor_code" expr="'b'"/> <else/> <assign name="flavor_code" expr="'?'"/> </if>
<prompt>カウント属性が無意味であるということを除けば、promptは、それらの十分な一般性における実行可能内容に現れうる。特に、condは、実行可能な内容に使われうる。promptは<prompt>と</prompt>で囲まれているか、もしくはPCDATAを用いて表される。どこででも<prompt>は許される。PCDATA xyzは、<prompt>xyz</prompt>として正確に翻訳される。
<nomatch count="1"> ドアを開くために、あなたのコードをはっきりと言って下さい。 </nomatch> <nomatch count="2"> <prompt> これが <emp> 最後の </emp> 猶予です。 </prompt> </nomatch> <nomatch count="3"> 入場は許可できません。 <exit/> </nomatch>
FIAが期待するのは、イベントの処理においてキャッチ要素が適切なプロンプトをキューに入れることである。しかしFIAは通常、キャッチ要素の実行後の繰り返し処理においては、プロンプト選択とキューイングは行わない。ただし、キャッチ要素の中でrepromptが実行された場合には、FIAは通常のプロンプト選択とキューイングを行い、フォーム要素のプロンプトカウンタをインクリメントする。
例えば、以下のnoinputによるキャッチは、次のフォーム要素においてプロンプトが選択され再生されることを期待している:
<field name="want_ice_cream" type="boolean"> <prompt> デザートにアイスクリームはいかがですか? </prompt> <prompt count="2"> アイスクリームが欲しい場合は「はい」と言って下さい。 アイスクリームがいらない場合は「いいえ」と言って下さい。 </prompt> <noinput> 聞き取れません。 <reprompt/> <!-- 次のプロンプトを選択させ再生させる --> </noinput> </field>
ユーザが何もしゃべらなかった場合:H:(沈黙) C:聞き取れません。C:アイスクリームが欲しい場合は「はい」と言って下さい。アイスクリームがいらない場合は「いいえ」と言って下さい。H:(沈黙) C:聞き取れません。C:アイスクリームが欲しい場合は「はい」と言って下さい。アイスクリームがいらない場合は「いいえ」と言って下さい。H:いいえ。
<reprompt>がない場合,ユーザにはこのように聞こえる。:C:デザートにアイスクリームはいかがですか? H:(沈黙) C:聞き取れません。C:聞き取れません。H:いいえ。
<reprompt>がcatchにおいて実行されないならば、それからFIAが選択されたフォーム項目のprompt選択、そして、列を作って待っているフェーズを飛ばすことを示す。フォーム項目のpromptカウンタは、そこでインクリメントされない。<reprompt>が実行されるならば、それからFIAはフォーム項目のprompt選択列を作って待っているフェーズを実行する。これは、フォーム項目のpromptカウンタをインクリメントする。<reprompt>によって、プレイされる前のpromptは決めない、しかし一般にpromptカウンタの現在の値、及び、promptコンディションの現在の値に基づいてプレイされるpromptを決める。
<goto>は、以下の様に使われる。
他のフォーム項目への遷移に、フォーム項目名がECMAScript式を用いて計算されるならば、nextitemまたは、expritemを使う:
<goto nextitem="ssn_confirm"/> <goto expritem="(type==12)? 'ssn_confirm' : 'reject'"/>
同じドキュメントにおける他の対話に行くために、URIフラグメントのみによってnext(或いはexpr)を使う:
<goto next="#another_dialog"/> <goto expr="'#' + 'another_dialog'"/>
他のドキュメントへの遷移に、URIと共にnext(或いはexpr)を使う:
<goto next="http://flight.example/reserve_seat"/> <goto next="./special_lunch/#wants_vegan"/>
URIは、絶対的もしくは、現在のドキュメントに関係がある。対話のid属性の値の一致するフラグメントを使う次のドキュメントにおいて起動対話を指定してもよい。フラグメントが指定されないならば、そのドキュメントにおける最初の対話が選択される。現在のドキュメントにおいて他の対話へ推移することは、古い対話の変数は失われることを示す。これは対話がその対話自身に推移する場合においてさえも同様である。他のドキュメントへの推移は、同様に古いドキュメントレベル変数を下げる。これは、たとえ新しいドキュメントが遷移を行っている1つと同じであるとしても同様である。データが多重ドキュメントを横断して固執することを望むならば、データをアプリケーション有効範囲に格納すればよい。
<goto>の属性は以下である:
next | 遷移するURI。 |
expr | URIをもたらすECMAScript式。 |
nextitem | 現在のformの中で次に訪れるフォーム項目の名前。 |
expritem | 次に訪れるformitemの名前をもたらすECMAScript式。 |
caching | 12.1.参照 |
fetchaudio | 12.1.参照 |
fetchhint | 12.1.参照 これは、documentfetchhintプロパティに履行しない。 |
fetchtimeout | 12.1.参照 |
expr、nextitemまたは、expritemのうちの1つは、指定されなければならない。
<submit>は、取得された新しいドキュメントに遷移するという点において<goto>に類似している。<goto>と異なるのは、変数の値をHTTP GETまたはPOST経由でドキュメントサーバに提出(submit)させる点である。例えば、いくつかのフォーム項目の値をサーバに提出するためには、以下のようにする:
<submit next="log_request" method="post" namelist="name rank serial_number" fetchtimeout="100s" fetchaudio="audio/brahms2.wav"/>
<submit>は以下の属性を含む:
next | クエリーが提出されるURI。 |
expr | 与えられたECMAScript表現にしたがってURIが動的に決定されることを除けばnextと同じである。nextまたは、exprのうちの1つが必要とされる。 |
namelist | 提出する変数のリスト。デフォルトでは名前を持つ全てのフィールド項目変数が提出される。namelistが与えられれば、それは個々の変数参照を含み得る。 |
method | リクエストのメソッド:get(デフォルト)もしくはpost。 |
enctype | 提出されたドキュメントのMIMEエンコーディング形式。デフォルトはapplication/x-www-form-urlencoded。インタプリタは他のエンコーディング形式をサポートすることができる。 |
caching | 12.1.参照 |
fetchaudio | 12.1.参照 |
fetchhint | 12.1.参照 documentfetchhintプロパティをデフォルトとする。 |
fetchtimeout | 12.1.参照 |
ECMAScriptオブジェクトoが提出のターゲットとなった場合は、全てのそのオブジェクトの(ECMAScriptにおける)フィールドf1、f2、...はo.f1、o.f2、などの名前を用いて提出される。
処理コンテクストへ制御を返し、次に行うべき処理の決定を委ねる。この要素により、全てのロードされたドキュメントを終了する。<subdialog>の呼び出しから戻る<return>要素とはこの点が異なる。<subdialog>によって新しいドキュメント(またはアプリケーション)が起動されたなら、<return>はドキュメントを中止させるが、その実行は<subdialog>終了後に再開する。
一度<exit>が処理コンテクストに制御を返せば、制御は処理コンテクストが自由に行うことができる。例えば、ユーザのためにトップレベルメニューを再生したり、電話回線を切断したり、ユーザの通話をオペレーターに転送する、などが考えられる。
属性は以下の通り:
expr | リターン表現(例:"0"、または、"oops!")。 |
namelist | インタープリタ文脈に戻る変数名。デフォルトは、変数を返さないことである;これは、インタープリタ文脈が空のECMAScriptオブジェクトを受け取ることを意味する。 |
リターンは、subdialogの実行を終え、そして、コントロール及び、データを呼び出し対話に返す。それらの属性は、以下である。
event | 戻る。その後、このeventを投げ掛ける。 |
namelist | 呼び出し対話に戻される変数名。そのデフォルトは、変数を返さないことである;これは、その呼び出し側が空のECMAScript対象を受け取ることを意味する。 |
subdialogから戻る際、eventは、呼び出しポイントで投げ掛けられうる、または、データは、ECMAScriptオブジェクトとして返される。subdialogとして実行していないとき、実行されるreturnは、semantic errorを投げかける。下の例は、subdialogが認識できる結果を獲得することができないとき、subdialogからその呼び出し対話まで増やされたeventを示す。同じくそれは、正常なコンディションの下で返されたデータを示す。
呼び出し側フォーム
<form> <subdialog name="result" src="#getssn"> <nomatch> <!-- subdialogによって返されるイベントが無いということは、 正当な社会保障番号が無いことを示す。--> <goto next="http://myservice.example/ssn-problems.vxml"/> </nomatch> <filled> <submit namelist="result.ssn" next="http://myservice.example/cgi-bin/process"/> </filled> </subdialog> </form>
社会保障番号を得るための subdialog
<form id="getssn"> <field name="ssn"> <grammar src="http://grammarlib/ssn.gram" type="application/x-jsgf"/> <prompt> 社会保障番号を言って下さい。 </prompt> <nomatch count=3> <return event="nomatch"/> </nomatch> <filled> <return namelist="ssn"/> </filled> </field> </form>
<nomatch>のためのsubdialogイベントハンドラが3回目の失敗のときに始動される。そのとき、それはsubdialogから戻り、そして呼び出し対話の文脈において投げられるためのnomatchイベントを加える。この場合、呼び出し対話は<filled>(そこで、その結果としての動作は<goto>を実行することである。)よりむしろ、その<nomatch>ハンドラを実行するであろう。正常なコンディションの下で、認識された社会保障番号が獲得された後、subdialogの<filled>は実行される。そして、この値は呼び出し対話に返されresult.ssnとしてアクセス可能となる。
処理コンテクストに回線を切断させる。その結果、処理コンテクストは、telephone.disconnected.hangupイベントを投げる。これをキャッチすることによりクリーンアップ処理が可能である。
<disconnect/>
<disconnect>は、<exit>と異なり、処理コンテクストに強制的に回線を切断させる。
<script>は、クライアント‐サイド作成の言語コードのブロックの仕様を許し、そしてHTMLの<SCRIPT>に類似している。例えば、このドキュメントは、階乗を計算するscriptを持っている。
<?xml version="1.0"?> <vxml version="1.0"> <script> <![CDATA[ function factorial(n) { return (n <= 1)? 1 : n * factorial(n-1); } ]]> </script> <form id="form"> <field name="fact" type="number"> <prompt> 数を1つ言って下さい。その階乗を計算します。 </prompt> <filled> <prompt> <value expr="fact"/> 階乗は <value expr="factorial(fact)"/> </prompt> </filled> </field> </form> </vxml>
<script>は、<vxml>において、もしくは、実行可能内容(<filled>,<if>, <block>, <catch>,もしくは短いformの<catch>)において発生する。ドキュメントがロードされた直後、<vxml>におけるスクリプトが評価される(ドキュメント順に<var>と一緒に)。他の実行可能なタグのように、実行可能内容における<script>は、出現順に実行される。
<script>は、次の属性を持っている:
src | それが外部であるならば、scriptの位置を指定するURI。 |
charset | srcによって示されたscriptのキャラクタエンコーディング。 |
caching | 12.1.参照 |
fetchhint | 12.1.参照 これは、scriptfetchhintプロパティに履行しない。 |
fetchtimeout | 12.1.参照 |
各<script>は、それが含むタグの有効範囲において実行される。すなわち、これ自体の有効範囲を所有していない。
ここにformの対話有効範囲において、時間変数を初期化するscriptを含むblockによる時間を告げるサービスがある:
<?xml version="1.0"?> <vxml version="1.0"> <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" type="boolean"> <prompt> 現在の時刻は <value expr="hours"/> 時、 <value expr="minutes"/> 分、 <value expr="seconds"/> 秒です。 </prompt> <prompt> 他に聞きたい時間はありますか? </prompt> <filled> <if cond="hear_another"> <clear/> </if> </filled> </field> </form> </vxml>
ECMAScript有効範囲(http://www.ecma.ch/stand/ECMA-262.htmのsection 10.1.4参照)は<var>の発生した中で設定される。そして<var>で宣言された変数が関連していた有効範囲に入れられる。全ての変数は、ECMAScript scriptもしくはVoiceXMLのタグによって、割り当てられるか、参照を付けられる前に宣言されなければならない。