フォーム項目はform処理中に訪れることのできる<form>内の要素である。それらは、<field>、<block>、<initial>、<subdialog>、<object>、<record>、<transfer>が含まれる。全てのフォーム項目が以下の特徴を持っている。
それぞれのフィールド項目は関連したシャドウ変数(shadow variable)のセットを持ちうる。シャドウ変数はフィールド項目の実行からの結果を返すために使われ、他の変数はname属性以下に記憶させておく。例えば、それは<field>要素内で認識された文法の結果をもたらされたconfidence levelを知るのに便利である。シャドウ変数は、フィールド項目のname属性の変数であるnameの場所name$.shadowvarとして、そして指定シャドウ変数の名前であるshadowvarとして参照される。例えば、<field>要素はシャドウ変数confidenceを返す。以下にコード断片はどのようにshadow変数がアクセスされるかを示す。
<field name="state">
<prompt> 状態名を言ってください。 </prompt>
<grammar src="http://mygrammars.example/states.gram"/>
<filled>
<if cond="state$.confidence < 0.4">
<throw event="nomatch"/>
</if>
</filled>
</field>
この例では、結果のconfidenceが調べられ、もしconfidenceが小さいなら結果がリジェクトされる。
fieldはユーザから収集されるための入力項目を指定する。fieldの属性は以下のものを含む。:
| name | 結果を保持する対話スコープ内のfield項目変数 |
| expr | フォーム項目変数の初期値;デフォルトはECMAScript undefinedである。もし変数が初期化されているなら、そのフォーム項目はフォーム項目変数がクリアされなければ訪れられることはない。 |
| cond | フォーム項目が訪れられるために真(true)と評価されなければならないboolean condition |
| type | fieldのタイプ。例:内部文法の名前。この名前はすべての準拠プラットフォームによりサポートされる標準セットからならなければならない。もし存在しない場合、<grammar>かつ/または<dtmf>要素が代わりに指定されることができる。 |
| slot | 変数を実装するために使われる文法スロットの名前(もし存在しないなら、変数名がデフォルトとなる)。この属性は、スロット/変数のセットを返す為のメカニズムを持ち、スロット名がfield項目変数名と違う、使用されている文法フォーマットで便利である。もし文法が、ブール代数のように組み込み式文法を返すときただ1つのスロットを返すなら、どんなスロット名でもfield項目変数はそのスロットの値を得る。 |
| modal | もしこれがfalse(デフォルト)なら、このフィールドの値を収集している間、全てのアクティブな文法も有効である。もしこれがtrueなら、フィールド文法のみが有効ある:すべての他の文法は一時的に無効になる。 |
名前がnameである<field>要素のシャドウ変数:
| name$.confidence | 認識結果内の0.0-1.0のconfidence level。0.0は最小confidenceをさし、1.0は最高confidenceをさす。confidence数値の処理のさらなる指定はプラットフォーム次第である。 |
| name$.utterance | 認識された単語そのままの文字列。正確なtokenizationと綴りはプラットフォーム指定(例:"five hundred thirty"または"5 hundred 30"または"530")である。 |
| name$.inputmode | ユーザ入力が提供されるモード(dtmfかvoice) |
<field>タイプ属性は本質的な組み込み文法を指定するためにつかわれ、もしその後プロンプト内の数値属性内で使用されるなら、どのようにその数値が話されるかをも特定する。例えば:
<field name="lo_fat_meal" type="boolean">
<prompt> フライト中、低脂肪な食事がよろしいですか? </prompt>
<help> 低脂肪な食事は脂肪が10g以下で250cal以下です。 </help>
<filled>
<prompt><emp><value expr="lo_fat_meal"/></emp> ですね。</prompt>
</filled>
</field>
この例において、booleanタイプは、入力は真(true)または偽(false)のどちらかの形式であることを指す。実際にfieldに代入される数値はtrueかfalseのどちらかである。fieldはプロンプト内で「はい」または「いいえ」と読まれる。
次の例で、digitは、入力が話されたまたはキー入力された数字列であることを指す。結果は文字列として保持され、数字として表現される。例:"百二十三"ではなく、"一-二-三"。<filled>アクションは、fieldが12桁の数字かどうかを検出する。もし違えば、ユーザにエラーメッセージを聞かせ、repromptによりnomatchイベントが投げ掛けられる。
<field name="ticket_num" type="digits">
<prompt> チケットから12桁の数字を読んでください。 </prompt>
<help> 12桁の数字は左下にあります。 </help>
<filled>
<if cond="ticket_num.length != 12">
<prompt> 申し訳ございませんが、聞き取れませんでした。 </prompt>
<assign name="ticket_num" expr="undefined"/>
</if>
</filled>
</field>
それぞれの組み込みタイプ用の入力規約があることが重要である。例えば、汎用のプロンプトおよびヘルプのメッセージを、VoiceXMLの全ての実装に対応できるように記述することができる。これらはロケール依存であり、若干の差異が許されている。例えば、booleanタイプの文法は「はい」「いいえ」と返事することを最小限許されているが、実装において「うん」のような別の選択を加えることは自由である。この場合、アプリケーションは異なった振る舞いを要する場合、明示的にフィールド文法を使うべきである。
それに加え、組み込みタイプには返された数値のフォーマット用の規約がある。組み込みfield用のreturnタイプは、boolean fieldタイプ用以外の文字列である。実際の認識結果にアクセスするために、作者はシャドウ変数name$.utteranceを参照することができる。
すべての組み込みタイプは音声とDTMF入力の両方をサポートしなければならない。
組み込みタイプ:
| boolean | 入力は、カレントlocaleに適当な断定的そして否定的なフレーズを含む。DTMF1が「はい」そして2が「いいえ」。結果はECMAScript trueが「はい」またはfalseが「いいえ」である。数値は文字列"true"または"false"として渡される。もしfield数値が後にprompt内で使用されるなら、カレントlocaleに適切な断定的または否定的フレーズとして話される。 |
| date | 有効な音声入力は年月日を情報として持つ日付の指定するフレーズを含む。DTMF入力:4桁の西暦、それにつづき2桁の月、さらに2桁の日。結果はフォーマット"yyyymmdd"である固定長データ文字列である。例:20000704。もし、西暦が指定されないなら、yyyyは"????"として返される。;月、日も同様にmm、ddは"??"として返される。 |
| digits | 有効な音声またはDTMF入力は1桁またはそれ以上の0〜9の数字列を含む。結果は数字の文字列である。もしfield数値がその後prompt内で使用されるなら、数字の羅列で話される。ユーザは例えば「二千百二十七」でなく、「二一二七」と言うことができる。 |
| currency | 有効な音声入力は流通貨幣を指定するフレーズを含む。DTMF入力では、小数点の代わりに"*"キーを活用すればよい。結果はフォーマットが"UUUmm.mm"である文字列であり、UUUにはISO標準4217:1995またはもしユーザにより話されないならNULLによる3文字の通貨インジケータが入る。もしfield数値が後でprompt内で使用されるなら、その場に応じた通貨として話される。 |
| number | 有効な音声入力は「百二十三」または「5.3」のような数を指定するフレーズを含む。有効なDTMF入力は、数字と小数点の代わりに"*"を用いて入力する数を含む。結果は0から9の数字と、オプションとして小数点(".")と/またはプラス・マイナスの記号を含む文字列である。 |
| phone | 有効な音声入力は電話番号を指定するフレーズを含む。DTMFアスタリスク"*"は"x"を意味する。結果は数字と拡張付き電話番号を指すための文字"x"からなる電話番号を含む文字列である。北アメリカ対応で、結果は"80055512345x789"となる。 |
| time | 有効な音声入力は時間と分を含む時間を指定するためのフレーズを含む。結果はフォーマット"hhmmx"となる5文字の文字列であり、xは"a"でAM、"p"でPM、"h"で24時間時計を用いて時間を指し、"?"で曖昧に時間を指す。DTMFを通して入力が可能である。なぜならDTMF入力の場合、AM/PMを特定するための規約がなく、結果は常に"h"または"?"で終わる。もしfieldの値が後でprompt内で使用されるなら、数値はその場において適当な時間として話される。 |
明示文法は絶対パスまたは相対パスによるURIを通して指定されることが可能である。
<field name="flavor">
<prompt> 何にしますか? </prompt>
<grammar src="../grammar/ice_cream.gram" type="application/x-jsgf"/>
</field>
文法は内部で指定されることが可能である、例えばJSGFを用いる。:
<field name="flavor">
<prompt> 何にしますか? </prompt>
<help> バニラ、チョコレート、ストロベリーから選んでください。 </help>
<grammar type="application/x-jsgf">
バニラ {van} | チョコレート {choc} | ストロベリー {straw}
</grammar>
<dtmf type="application/x-jsgf">
1 {van} | 2 {choc} | 3 {straw}
</dtmf>
</field>
選択肢の単純なセットが全てfieldへの規定通りの入力数値を指定する必要があるなら、オプションリストを文法よりも使いやすくするべきである。オプションリストは、<field>要素に含まれる<option>要素により表示される。それぞれの<option>要素は、<choice>に記述される同じ秩序を使用することを受諾する音声入力用の文法を生成するために使用されるPCDATAを含む。それは、オプションの選択とオプションが選択されたとき、数値をfieldに渡すためのDTMFキーを指定する属性をも持つ。
以下のfieldはユーザに3つの選択肢を提示し、maincourse変数へ選択されたオプションのvalue属性の数値を受け渡す。
<form>
<field name="maincourse">
<prompt>
メインディッシュを選んでください。今日のメニューは <enumerate/> です。
</prompt>
<option dtmf="1" value="fish"> メカジキ </option>
<option dtmf="2" value="beef"> ローストビーフ </option>
<option dtmf="3" value="chicken"> カエルの足 </option>
<filled>
<submit next="/cgi-bin/maincourse.cgi" method="post"
namelist="maincourse"/>
</filled>
</field>
</form>
この会話は以下のように行われる。:
C:メインディッシュを選んでください。今日のメニューはメカジキ; ローストビーフ;
カエルの足です。
H:カエルの足
C:("maincourse"に"chicken"を渡し、その後/maincourse.cgiへ"maincourse=chicken"を提出。)
<enumerate>要素については7章で説明している。
<option>の属性:
| dtmf | このオプション用のDTMFシーケンス |
| value | ユーザがこのオプションを音声またはDTMFにより選択したときに、field項目変数に受け渡す文字列。この属性のデフォルト数値は、行間隔と削除された後書きスペース付きの<option>要素のCDATA文書である。 |
いくつかの組み込みfieldタイプはパラメータ化できる。これは、特別-目的"builtin:"URIスキーマと<grammar>または<dtmf>要素のsrc属性の、またはfieldのtype属性のformtype?parm=valueのURIスタイル問い合わせ構文を使用する組み込み文法を明示的に参照することにより行われる。例えば:
<grammar src="builtin:grammar/boolean"/>
<dtmf src="builtin:dtmf/boolean?y=7"/>
<field type="digits?minlength=3;maxlength=5">....</field>
定義により、
<field type="X">...</field>
と
<field>
<grammar src=builtin:grammar/X"/>
<dtmf src="builton:dtmf/X"/>
....
</field>
は、Xが1つの組み込みfieldタイプ(boolean,date,etc.)である点で同様である。digitsとboolean文法は以下のようにパラメータ化される。:
| digits?minlength=n | 最低n桁の数字列 |
| digits?maxlength=n | 最高n桁の数字列 |
| digits?length=n | 厳密にn桁の数字列 |
| boolean?y=d | 肯定の答えとしてdキーを押すとみなすDTMF文法 |
| boolean?n=d | 否定の答えとしてdキーを押すとみなすDTMF文法 |
注:1つ以上のパラメータは上記の説明のように";"により分けて指定される。<grammar>または<dtmf>要素内の、src属性URIは上記のようにbuiltin:grammar/またはbuiltin:dtmfにより始めなければならない。
<grammar>要素が<field>要素内で指定されるとき、それはfieldのtype属性により暗示されるデフォルト会話文法を上書きする。同様に、<dtmf>要素が<field>要素内で指定されるとき、それはデフォルトDTMF文法を上書きする。
blockはフォーム項目である。それは、もしblockのフォーム項目変数がundefinedであり、blockのcond属性が少しでもtrueと評価するなら実行可能内容を含む。
<block>
Flamingo.exampleへようこそ、your source for lawn ornaments.
</block>
フォーム項目変数はそのblockに入る丁度前に自動的にtrue(真)にセットされる。その点では、blockはformの起動毎にただ1度、典型的に実行される。
blockについて、さらに制御が必要となることがある。このため、フォーム項目変数に名前をつけることと、<block>の実行を制御するためにその変数をセットまたはクリアすることが可能である。この変数はformのdialog scope内で定義される。
<block>の属性:
| name | 実行することが適当なブロックを追跡するために使用されるフォーム項目変数;デフォルトではアクセスできない内部変数である。 |
| expr | フォーム項目変数の初期値;デフォルトはECMAScriptにおけるundefined値である。もしある値で初期化されるなら、そのフォーム項目はクリアされない限り訪れられない。 |
| cond | 訪れられるフォーム項目にとって適切にtrue(真)を評価しなければならないブール型コンディション。 |
典型的な混合主導型form内で、<initial>要素はユーザが最初にform-wide情報をプロンプトされたとき訪れられ、そしてそれぞれのfieldが単一で要請される指示モード内部にまだ入っていない。field項目のように、それはprompt、catch、そしてeventカウンタを持っている。field項目との相違点は、<initial>は文法と<filled>アクションを持たないことである。例えば:
<form id="get_from_and_to_cities">
<grammar src="http://www.directions.example/grammars/from_to.gram"/>
<block>
電話によるドライブ案内へようこそ。
</block>
<initial name="bypass_init">
<prompt> どこからどこへ行きたいですか? </prompt>
<nomatch count="1">
Atlanta GeorgiaからToledo Ohioのように言ってください。
</nomatch>
<nomatch count="2">
申し訳ございません、理解できませんでした。
情報の一部分をたずねます。
<assign name="bypass_init" expr="true"/>
<reprompt/>
</nomatch>
</initial>
<field name="from_city">
<grammar src="http://www.directions.exaple/grammars/city.gram"/>
<prompt> 出発地はどこですか? </prompt>
... etc. ...
</field>
... etc. ...
</form>
<initial>要素にアクセスしている間、全てのフィールド文法が非アクティブである。もし<initial>が訪れられている間にイベントが発生したら、イベントハンドラが実行される。他のフォーム項目と同様、<initial>はフォーム項目変数がundefinedでありcond属性がtrueである間、訪れられる。もし1つ以上のフィールド項目変数がユーザ入力によりセットされたら、すべての<initial>のフォーム項目変数は、<filled>アクションが実行される前にtrueにセットされる。
<initial>フォーム項目変数は不可能であることを明示的にごまかすこと、または<initial>のFIAを再度可能にする。例えば、上のプログラム内で、<initial>のフォーム項目変数が2回目のnomatchイベントにセットされる。このもはや<initial>と見なさないため、かつ次のフォーム項目を選択するためのFIAの目的は、初めのcityのために明確にpromptするための<field>である。同様に、<initial>のフォーム項目変数はクリアされることができるので、<initial>はFIAにより再選択されることが可能になる。
注:field項目変数への明確な数値の受け渡しは<initial>のフォーム項目変数の数値に影響を与えない。
<initial>の属性:
| name | <initial>が実行するのに適しているかどうかをトラックするために使用されるフォーム項目変数の名前;デフォルトは得難い内部変数 |
| expr | フォーム項目変数の初期値;デフォルトはECMAScript undefinedである。もし数値を初期化するなら、フォーム項目はフォーム項目変数がクリアされるまでアクセスされることはない。 |
| cond | フォーム項目にアクセスするためにはtrueに評価されていなければならないブール型コンディション。 |
<subdialog>要素はそのsrc属性により指定される"called"dialog(subdialogとして知られている)を含む。subdialogは新しい実行コンテキスト内で実行する。subdialogは、subdialogから返る原因となる<return>要素の実行まで続けられる。subdialogが返るとき、その実行文書は削除され、実行はいくつかの特定の<filled>要素とともに呼び出すdialog内で再起する。1つの実行文書はすべての宣言と対話、対話のドキュメント、そして(存在する場合)アプリケーションルート用の状態情報をインクルードする。subdialogは、クレジットカード情報のユーザへのプロンプティング、または再利用可能アプリケーションのライブラリの構築の例のような共通対話の再利用の許可ができる。
subdialogの属性:
| name | subdialogから返された結果で、プロパティが<return>要素のnamelist属性内で定義されているECMAScriptオブジェクト。 |
| expr | フォーム項目変数の初期値。デフォルトはECMAScript undefinedである。もし数値が初期化されたなら、フォーム項目はフォーム項目変数がクリアされるまでアクセスされることはない。 |
| cond | アクセスされているフォーム項目がtrueかどうかを評価するブール型のコンディション。 |
| modal | subdialog間で、アクティブである文法を制御する。もしtrue(デフォルト)なら、全ての文法が実行不能呼び出し対話内でアクティブである。 |
| namelist | デフォルトで何も渡さない点を除き、<submit>内のnamelistと同等である。他のドキュメントをフェッチするときに限って有効である。 |
| src | <subdialog>のURI |
| method | 19.8参照 |
| enctype | 19.8参照 |
| caching | 12.1.参照 |
| fetchaudio | 12.1.参照 |
| fetchtimeout | 12.1.参照 |
| fetchhint | 12.1.参照 |
<subdialog>要素は全てのフォーム項目に共通の要素を含み、<param>要素をも含む。<param>要素はsubdialogへ渡すためのパラメータを指定する。これらのパラメータは<var>要素を用いsubdialog内で定義される;フォーム項目変数もしくは<param>要素を用いた未定義変数のセットを試みることは構文エラーである。subdialogが初期化される際、その変数がexpr属性を持たない場合、<param>要素に一致するよう初期化される。従って、<param>要素はexpr属性なしで<var>要素を初期化することだけができる。
以下の例では、個人の誕生日が運転免許証を検証するために使われている。subdialogのsrc属性は同一ドキュメント内のformを参照している。<param>要素はsubdialogへのパスのために誕生日の数値が使われている。
<!-- subdialogを呼び出すform dialog -->
<form>
<subdialog name="result" src="#getdriverslicense">
<param name="birthday" expr="'2000-02-10'"/>
<filled>
<submit next="http://myservice.example/cgi-bin/process/"/>
</filled>
</subdialog>
</form>
<!-- 運転免許証情報をsubdialogが得る -->
<form id="getdriverslicense">
<var name="birthday"/>
<field name="drivelicense">
<grammar src="http://grammarlib/drivegrammar.gram" \
type="application/x-jsgf"/>
<prompt> 運転免許証を言ってください。</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>
driver's licenseの値は、免許が正当かそうでないかを示すためのステータス変数と一緒に対話呼び出しへ返される。
以下の例もまたサーバサイドスクリプティングの使用抜きでsubdialog内の数値を具体化するための手段としてsubdialogへデータを受け渡す手段としての<param>の使用の便利さを示している。スクリプティングを使用する替わりのソリューションを以下に示す。
subdialogを呼び出すformのあるドキュメント
<?xml version="1.0">
<vxml version="1.0">
<form>
<field name="birthday" type="date">
誕生日はいつですか?
</field>
<subdialog name="result"
src="/cgi-bin/getlib#getdriverslicense"
namelist="birthday">
<filled>
<submit next="http://myservice.example/cgi-bin/process"/>
</filled>
</subdialog>
</form>
</vxml>
subdialogを含むドキュメント(/cgi-bib/getlibによって生成された)
<?xml version="1.0"?>
<vxml version="1.0">
<form id="getdriverlicense">
<var name="birthday" expr="'1980-02-10'"/>
<!-- サーバースクリプトにより生成された -->
<field name="drivelicense">
<grammar src="http://grammarlib/drivergrammar.gram"
type="application/x-jsgf"/>
<prompt> 運転免許証番号を言ってください。</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のdialog-有効範囲内のそれらでありかつデフォルト文法が処理コンテキストにより定義される(例:help,cancel)。アクティブ文法のセットは<return>が実行されるまで、限られたすべての後続の対話が残る。例えば、もしsubdialogAが対話Bへうつるなら、Bの処理はその対話スコープとデフォルト文法内のアクティブな文法のみを検討する。
以下の例は、クレジットカード情報全般を取り込むためのsubdialogを示す。最初のsubdialogは、複数のドキュメント内で定義されている。;それは異なるアプリケーションを通して再利用可能であることを意味する。それはステータス、クレジットカード番号、そして満了日を返す;もし結果が獲得できないなら、ステータスとして値"no_result"を返す。
<?xml version="1.0"?>
<vxml version="1.0">
<!-- クレジットカード情報を収集するsubdialogの例 -->
<!-- ファイルは http://www.somedomain.example/ccn.vxmlにある -->
<form id="getcredit">
<var name="status" expr="'no_result'"/>
<var name="username"/>
<field name="creditcardnum">
<prompt> クレジットカード番号は何番ですか? </prompt>
<help>
クレジットカード情報を収集しています。
<reprompt/>
</help>
<nomatch> <return namelist="status'/> </nomatch>
<grammar .../>
</field>
<field name="expirydate" type="date">
<prompt>
クレジットカードの有効期限はいつですか?
</prompt>
<help>
クレジットカードの有効期限を収集しています。
<reprompt/>
</help>
<nomatch>
<return namelist="status"/>
</nomatch>
</field>
<block>
<assign name="status" expr="'result'"/>
<return namelist="status creditcardnum expirydate"/>
</block>
</form>
</vxml>
呼び出し関数を含むアプリケーションを以下に示す。ソフトウェア製品の名前と混合主導型対話を使用するオペレーティングシステムを獲得し、それからsubdialogを用いクレジットカード情報を要請する。
<?xml version="1.0"?>
<vxml version="1.0">
<!-- メインプログラムの例 -->
<!-- http://www.somedomain.example/main.vxml -->
<!-- subdialog ccn.vxml を呼び出す -->
<var name="username"/>
<!-- いくつかの対話によって定義されると仮定する -->
<form id="buysoftware">
<var name="ccn"/>
<var name="exp"/>
<grammar .../>
<initial name="start">
<prompt>
購入するソフトウェアとそのソフトウェアが動作するOSを言ってください。
</prompt>
<noinput>
<assign name="start" expr="true"/>
</noinput>
</initial>
<field name="product">
<prompt> どのソフトウェアを購入したいですか? </prompt>
</field>
<field name="operatingsystem">
<prompt>
このソフトウエアはどのOSで動作しますか?
</prompt>
</field>
<subdialog name="cc_results" src="http://somedomain.example/ccn.vxml">
<filled>
<if cond="cc_results.status=='no_result'">
申し訳ございません、クレジットカード情報を得られませんでした。
この注文はキャンセルされます。
<exit/>
<else/>
<assign name="ccn" expr="cc_results.creditcardnum"/>
<assign name="exp" expr="cc_results.expirydate"/>
</if>
</filled>
</subdialog>
<block>
注文を受け付けました。お待ちください。
<submit namelist="username product operatingsystem ccn exp"/>
</block>
</form>
</vxml>
VoiceXML実装プラットフォームはspeaker verification、native components、additional telephony functionalityなどのようなアプリケーションが使用したいプラットフォーム指定機能を持つ。そのようなプラットフォーム指定オブジェクトは、HTML <OBJECT>要素に類似の<object>要素を使用することによりアクセスされる。例えば、nativeクレジットカード収集オブジェクトはこのようにアクセスされることができる。
<object name="debit"
classid="method://credit_card/gather_and_debit"
data="http://www.recordings.example/prompts/credit/jesse.jar"/>
<param name="amount" expr="document.amt"/>
<param name="vendor" expr="vendor_num"/>
</object>
この例で、<param>要素は呼び出されるときに、オブジェクトにパスするためのパラメータとして使われる。この<object>は実行されるとき、そのフォーム項目変数の値としてECMAScriptオブジェクトを返す。この<block>はクレジットカードオブジェクトから返された数値を渡す。
<block>
<prompt>
カードの種類は <value expr="debit.card"/> です。
</prompt>
<prompt>
カード番号は <value expr="debit.card_no"/> です。
</prompt>
<prompt>
有効期限は <value expr="debit.expiry_date"/> です。
</prompt>
<prompt>
認証コードは <value expr="debit.approval_code"/> です。
</prompt>
<prompt>
確認番号は <value expr="debit.conf_no"/> です。
</prompt>
</block>
他の例として、プラットフォームが電話のキーを利用して任意のテキストメッセージの入力をユーザに許す機能を持っていると仮定する。
<form id="gather_pager_message">
<object name="message" classid="builtin://keypad_text_input">
<prompt>
1文字につき1回キーボードを押すことによりメッセージを入力して
ください。スペースはスターを入力して下さい。メッセージを終了
するにはポンドサインを押してください。
</prompt>
</object>
<block>
<assign name="document.pager_message" expr="message.text"/>
<goto next="#confirm_pager_message"/>
</block>
</form>
ユーザは最初pager messageのためにプロンプトされる、それからキー入力する。<block>はメッセージを変数document.messageにコピーする。
<object>の属性:
| name | objectが評価されるとき、objectにより定義されるECMAScript数値のタイプにこの変数をセットする。 |
| expr | フォーム項目変数の初期値;デフォルトはECMAScript undefined。もし数値が初期化されるなら、フォーム項目はフォーム項目変数がクリアされるまで訪れられることはない。 |
| cond | フォーム項目に訪れるために、trueと評価する必要があるブール型のコンディション。 |
| classid | オブジェクトの実装の場所を指定するURI。URI規約はプラットフォーム依存である。 |
| codebase | classid、data、archiveにより指定されるURIを決定するために使用されるベースパス。デフォルトはカレントドキュメントのベースURI。 |
| codetype | classidにより指定されたオブジェクトをダウンロードしているとき、期待されるデータの内容(content)タイプ。指定されていない場合、デフォルトでtype属性の数値があてがわれる。 |
| data | objectのデータの場所を指すURI。もしそれが適切なURIなら、codebase属性に関連のある処理をする。 |
| type | data属性により指定されるデータのコンテンツタイプ。 |
| archive | classidとdata属性により指定されるリソースを含むリソースに関連するオブジェクトを含むアーカイブに格納するためのURIのspace-separatedリスト。 |
| caching | 12.1.参照 |
| fetchaudio | 12.1.参照 |
| fetchhint | 12.1.参照 デフォルトはobjectfetchhintプロパティ。 |
| fetchtimeout | 12.1.参照 |
もし<object>要素が未知のobjectを参照するなら、error.unsupported.objectイベントが投げ掛けられる。プラットフォーム-指定オブジェクトを提供するための実装への要求はないが、<object>要素のサポートは要求される。
<record>要素はユーザからの録音を集めるfield項目である。録音はfield項目変数に格納され、再生またはサーバへの受け渡しが可能である。以下に例を示す。:
<?xml version="1.0"?>
<vxml version="1.0">
<form>
<record name="greeting" beep="true" maxtime="10s"
finalsilence="4000ms" dtmfterm="true" type="audio/wav">
<prompt> 音がしたら、挨拶してください。 </prompt>
<noinput> 聞き取れませんでした。もう一度お願いします。 </noinput>
</record>
<field name="confirm" type="boolean">
<prompt>
あなたの挨拶は <value expr="greeting"/> です。
</prompt>
<prompt>
これでよろしければ「はい」と、
よくなければ「いいえ」と言ってください。
</prompt>
<filled>
<if cond="confirm">
<submit next="save_greeting.pl" method="post" namelist="greeting"/>
</if>
<clear/>
</filled>
</field>
</form>
</vxml>
ユーザは挨拶のためにプロンプトされ、挨拶を録音する。挨拶は再生され、もしユーザが気に入れば、HTTP POST methodで記憶用のサーバ上に送られる。他のfield項目と同様に、<record>はpromptとcatch要素を持つ。<filled>アクションも持つであろう。もしプラットフォームが同時の認識・録音をサポートしているなら、formと文法を有効範囲とするドキュメントは録音が進行している間はアクティブであることができる。
<record>の属性:
| name | 録音を保持するfield項目変数。 |
| expr | フォーム項目変数の初期値;デフォルトはECMAScript undefined。もし数値が初期化されるなら、フォーム項目はフォーム項目変数がクリアされるまで訪れられない。 |
| cond | 訪れられるためにフォーム項目がtrueと評価されなければならないブール型条件。 |
| modal | もしこれがtrue(デフォルト)なら、すべての上位レベルの音声入力とDTMF文法は録音中は止められる。 |
| beep | もしtrueなら、録音する直前に音が発せられる。デフォルトはfalse。 |
| maxtime | 録音の最高継続時間。 |
| finalsilence | 対話の終了を示す、無音時間。 |
| dtmfterm | もしtrueなら、DTMFキー入力で録音を終了する、デフォルトはtrueである。DTMFトーンは録音部分ではない。 |
| type | 録音結果のMIMEフォーマット。デフォルトはプラットフォーム指定フォーマット。 |
<record>shadow変数name$は、録音終了後以下のECMAScriptプロパティを持つ。
| name$.duration | 録音時間。単位はm秒 |
| name$.size | 録音音声のサイズ。単位はbyte |
| name$.termchar | もしdtmfterm属性がtrueかつ、ユーザがDTMFキー入力により録音を終了したなら、このshadow変数は入力されたキーである。(例:"#")他の場合はnullである。 |
時々、ユーザと処理系の間のセッションを一時停止し、別の構成要素とともにセッションを始めることが適当である。多くのカレントプラクティス内のこの能力にとって共通の使用は、電話会話中のユーザを、処理系を用い電話ネットワークを通してサードパーティにつなげることである。<transfer>要素は処理系にサードパーティコネクションのようなものを形成することを指示する。2つのシナリオがサポートされている:
| bridging | 処理系による、発信者のセッション再開。 |
| blind transfer | 再開不能;通話が接続されると同時にプラットフォームがtelephone.disconnect.transferを投げる。 |
そのフォーム項目変数は試転送の結果を格納するために使用される。以下は可能な数値である。
| busy | 終端点がコールを拒んだ。 |
| noanswer | 指定された時間内に返事がない。 |
| network_busy | 中間ネットワークがコールを拒んだ。 |
| near_end_disconnect | コールが成功し、発信者により切断された。 |
| far_end_disconnect | コールが成功し、着信者により切断された。 |
| network_disconnect | コールが成功し、ネットワークにより切断された。 |
この例はユーザがお客様サポートセンターに移動することを試み、それから会話が終了するのを待っている。:
<form name="transfer">
<var name="myfur" expr="0"/>
<block>
<audio src="chopin12.wav">
</block>
<transfer name="mycall" dest="phone://18005551234"
connecttimeout="30s" bridge="true">
<filled>
<assign name="mydur" expr="mycall$.duration"/>
<if cond="mycall == 'busy'">
<prompt>
申し訳ございません、お客様センターは他のお客様への仕事で
忙しいです。後ほど試みてください。
other customers. Please try again later.
</prompt>
<elseif cond="mycall == 'noanswer'"/>
<prompt>
申し訳ございません、お客様サポートセンターの営業時間は
月曜日から土曜日の午前9時から午後7時までです。
</prompt>
</if>
</filled>
</transfer>
<block>
<submit namelist="mycall mydur" next="/cgi-bin/report"/>
</block>
</form>
bridge転送の間、プラットフォームは発信者からのDTMF入力を察知することができる。特に、もしDTMF文法が<transfer>要素内部に存在するなら、文法にマッチするDTMF入力によって転送を切断し、処理系へ制御を返す。bridge転送はenclosed<grammar>要素にマッチする発生の認識により切断される。<transfer>要素はそのアクティブである有効範囲の外部に定義されている文法がないmodalである。
属性:
| name | 転送を試みた結果。 |
| expr | フォーム項目変数の初期値。;デフォルトでECMAScript undefinedである。数値が初期化されるなら、フォーム項目変数がクリアされるまで、フォーム項目が訪れられることはない。 |
| cond | フォーム項目が訪れられるためには、trueでないといけないブール型コンディション。 |
| dest | 受信者のURI(電話番号、IP telephony address) |
| destexpr | 受信者のURIを渡すECMAScript表現 |
| bridge | この属性はコールが繋がったときに何をするか決定する。もしbridgeがtrueなら、ドキュメント処理はコール切断が転送されるまで停止する。 |
| connecttimeout | noanswerコンディションが返還される前に電話をつなごうとしている間の待ち時間。デフォルトはプラットフォーム指定である。 |
| maxtime | 電話が継続することを許される時間。もし任意の時間続けることができるなら、0とする。 |
<transfer>隠れ変数(name$)は、転送完了後以下のECMAScriptプロパティを持つ。
<transfer>内で投げ掛けるイベント。