VoiceXMLドキュメントは原則として対話と呼ばれる最上位要素から構成される。対話にはformとmenuの二種類がある。ドキュメントは、<meta>要素、<var>と<script>要素、<property>要素、<catch>要素、そして<link>要素などを持つこともある。
1つのドキュメント内の実行
ドキュメントの実行は何も指定がないときは、最初の対話から始まる。対話が実行されると、次の対話が決定される。対話が後続の対話を指定しないとき、ドキュメントの実行は停止する。
"こんにちは!"を拡張してこれを説明する。この例ではあいさつの言葉を保持するドキュメントレベルの変数"hi"を持っている。その値は1番目のformでプロンプトとして使用されている。1番目のformがあいさつを実行すると、ユーザに"さようなら!"と告げる"say_goodbye"という名前のformに移動する。2番目のformは他の対話に遷移する要素を持っていないので、ドキュメントは終了される。
<?xml version="1.0"?>
<vxml version="1.0">
<meta name="author" content="工繊 太郎"/>
<meta name="maintainer" content="hello-support@hi.example"/>
<var name="hi" expr="'こんにちは!'"/>
<form>
<block>
<value expr="hi"/>
<goto next="#say_goodbye"/>
</block>
</form>
<form id="say_goodbye">
<block>
さようなら!
</block>
</form>
</vxml>
スタイルとしては、これらのformは結合する方がよい。
<?xml version="1.0"?>
<vxml version="1.0">
<meta name="author" content="工繊 太郎"/>
<meta name="maintainer" content="hello-support@hi.example"/>
<var name="hi" expr="'こんにちは!'"/>
<form>
<block>
<value expr="hi"/>
さようなら!
</block>
</form>
</vxml>
<vxml>の属性を以下に示す。
| version | ドキュメントのVoiceXMLのバージョン(必須)。最初のバージョンは1.0。 |
| base | ベースとなるURI。 |
| lang | このドキュメントの言語とlocaleタイプ。 |
| application | (もしあれば)このドキュメントのアプリケーションルートドキュメントのURI。 |
複数ドキュメントアプリケーションの実行
通常はそれぞれのドキュメントは単独のアプリケーションとして実行する。複数のドキュメントを1つのアプリケーションとして動作させたい場合は、1つのドキュメントをアプリケーションルートドキュメントとして選択し、他のドキュメントの<vxml>のapplication属性にアプリケーションルートドキュメントのURIを指定すればよい。
このような場合は、処理系はこのアプリケーション内のドキュメントを読みこむたびに、アプリケーションルートドキュメントが未だ読み込まれていないなら、それを読みこむ。アプリケーションルートドキュメントは、処理系が異なるアプリケーションに属するドキュメントをロードするまでロードされたままになっている。したがって下記の2つの条件のうち1つは、処理の間、常に成立する。
複数ドキュメントからなるアプリケーションには2つの利点がある。1つは、アプリケーションルートドキュメントの変数がアプリケーション内の他のドキュメントで使用することができるため、情報の共有と保持が可能である。もう1つは、ユーザが他のアプリケーションドキュメントにいるときでも、アプリケーションルートドキュメントの文法が有効であるため、ユーザは常に共通のform、link、menuで会話することができる。
以下に「2つのドキュメントからなるアプリケーション」の例を示す。
アプリケーションルートドキュメント(app-root.vxml)
<xml version="1.0"?>
<vxml version="1.0">
<var name="bye" expr="'ちゃら'"/>
<link next="operator_xfer.vxml">
<grammar> オペレータ </grammar>
</link>
</vxml>
メインドキュメント(main.vxml)
<?xml version="1.0"?>
<vxml version="1.0" application="app-root.vxml">
<form id="say_goodbye">
<field name="answer" type="boolean">
<prompt>
<value expr="application.bye"/> にしましょうか
</prompt>
<filled>
<if cond="answer">
<exit/>
</if>
<clear namelist="answer"/>
</filled>
</field>
</form>
</vxml>
この例の場合、アプリケーションはmain.vxmlが最初に読みこまれなければならないよう設計されている。そのapplication属性は、アプリケーションルートドキュメントとしてインポートされるapp-root.vxmlを指定する。よって、app-root.vxmlが読みこまれ、アプリケーション変数"bye"を生成し、また、ユーザが"オペレータ"と言うとoperator-xfer.vxmlに遷移するリンクを定義する。ユーザとの対話はsay_goodbyeと名づけられたformから始まる。
C:ちゃらにしましょうか H:せやな C:理解できませんでした。 (プラットフォームに依存する初期設定メッセージ) H:ちゃら C:理解できませんでした。 H:オペレータ C:(operator_xfer.vxmlに移動し、人間のオペレータに転送する。)
マルチドキュメントアプリケーションの実行中は、同時に読み込まれるドキュメントは高々2つ:アプリケーションルートドキュメント、および、ユーザがルートドキュメントと対話していない場合はその他のアプリケーションドキュメント、であることに注意せよ。
もしドキュメントが、存在しないアプリケーションルートドキュメントを参照していたり、アプリケーションルートドキュメントが他のアプリケーションルートドキュメントを参照している場合は、error.semanticイベントが投げられる。
副対話
副対話は複雑な対話の系列をより良い構造にするために分割したり、再利用可能な部品を作成する機能である。例えば、口座情報の要求は、口座番号や電話番号のようないくつかの情報を集めることからなる。お客様相談サービスは、この基本的な構造を共有するいくつかの独立したアプリケーションから構成することができるので、この部分を副対話として構成することは妥当であろう。以下の例に示されている最初のドキュメントapp.vxmlは、適合する客の口座を捜索し、口座情報を獲得しそれから支払金額を得る。口座情報はユーザに入力を求める別のVoiceXMLドキュメントを呼び出す<subdialog>要素を用いて得ることができる。二番目のドキュメント(acct_info.vxml)が実行されている間、呼び出した側の対話は一時停止され、情報が戻ってくるのを待つ。二番目のドキュメントは<return>要素を使用してユーザとの会話の結果を提供し、結果の値は<subdialog>要素上でname属性により定義された変数を通してアクセスされる。
お客様サービスアプリケーション(app.vxml)
<?xml version="1.0"?>
<vxml version="1.0">
<form id="billing_adjustment">
<var name="account_number"/>
<var name="home_phone"/>
<subdialog name="accountinfo" src="acct_info.vxml#basic">
<filled>
<!-- 注:"accountinfo"によって定義された変数はECMAScriptの
オブジェクトとして返され、"副対話"の"return"要素で指定
される変数によって定義される2つのプロパティを含む。 -->
<assign name="account_number" expr="accountinfo.acctnum"/>
<assign name="home_phone" expr="accountinfo.acctphone"/>
</filled>
</subdialog>
<field name="adjustment_amount" type="currency">
<prompt> 支払金額はいくらですか? </prompt>
<filled>
<submit next="/cgi-bin/updateaccount"/>
</filled>
</field>
</form>
</vxml>
口座情報を収集するドキュメント(acct_info.vxml)
<?xml version="1.0"?>
<vxml version="1.0">
<form id="basic">
<field name="acctnum" type="digits">
<prompt> 口座番号は何番ですか? </prompt>
</field>
<field name="acctphone" type="phone">
<prompt> 電話番号は何番ですか? </prompt>
<filled>
<!-- 2つのfieldによって得られた値は"return"要素によって呼び出した対話に戻る。 -->
<return namelist="acctnum acctphone"/>
</filled>
</field>
</form>
</vxml>
副対話は、呼び出されたとき新しい実行環境を加える。副対話は既存のドキュメントの、または新しいドキュメントの内部で新しい対話になることができる。副対話を呼び出すと、アクティブな文法の有効範囲は副対話内に限られる。
図3にドキュメント(D)の系列が副対話(SD)に移り、戻るときの実行フローを示す。
