Extensible Interaction Sheets Language : XISL

version:1.0

January 30, 2002

著者

目次

概要

本文書ではXISL( Extensible Interaction Sheet Language)を規定する. XISLはマルチモーダル入出力を用いたインタラクションを記述するための言語である. XISLの目標は,マルチモーダルを利用した,高度なインタラクションの実現である.

1. はじめに

XISLは任意のXMLドキュメント内の要素(以後,XML要素と呼ぶ)とユーザとのインタラ クションを記述するための言語である.ここでいうインタラクションとは,XML要素(例 えばブラウザにより表示されている)に対するユーザの操作(クリック,音声入力等), およびそれに対するシステムの動作(画面の更新,音声出力等)を指す.XISLではマルチ モーダルインタラクション,すなわち複数の入出力手段を統合利用したインタラクション を取り扱うことができる.これを実現するために,並行入出力,逐次入出力,択一入力の 記述が可能になっている.また対話(インタラクションの集合)の流れを記述するために, 対話の遷移,割り込み等の処理をはじめとする,対話制御のための様々な命令が用意され ている.

図 1に伝統的な"Hello World"を出力する対話例を示す."hello.xml" はインタラクションを付加するXMLドキュメントであり,"hello.xsl"(XSLスタイルシート) を用いて,<page>の内容がブラウザに表示されていると想定する. "hello.xisl"はXISLドキュメントであり,<page>がクリックされたときにシステムが "Hello World"と発話する対話を記述している.

注意:XISLでは<input>,および<output>の仕様に関して,属性の種類のみ を規定している.つまり,本仕様では,属性値および内容は規定しない. これは<input>および<output>の記述に自由度を持たせることで,入出力モ ダリティの拡張や変更に備えるためである.<input>および<output>の属性 値の記法や,要素の内容の仕様策定は,入出力端末(フロントエンド)の開発者に委ねる (フロントエンドのタイプごとに何らかの標準化が行なわれることが望ましい).

hello.xml

<?xml  version="1.0"  encoding="Shift-JIS"?>
<?xml-stylesheet  type="text/xsl"  href="hello.xsl"?>
<!DOCTYPE  hello  SYSTEM  "hello.dtd">
<page>  Touch this page to hear"Hello World!"</page>

      
hello.xisl
<?xml version="1.0" encoding="Shift-JIS"?>
<!DOCTYPE xisl SYSTEM "xisl.dtd">
<xisl version="1.0">
   <head> …… </head>
   <body>    
      <dialog id="Hello World">
         <exchange>
            <operation target="hello.xml">
               <input type="touch" event="click" match="/page" />
            </operation>
            <action>
               <output type="speech" event="tts-speech">
               <![CDATA[ 
                  <param name="speech_text"> Hello World! </param>
               ]]>
               </output>
            </action>
         </exchange>
      </dialog>  
   </body>
</xisl>

      

図1 XMLドキュメントとXISLドキュメントの記述例

2. XISL実行システム

XISL実行システムは図 2に示すようにFront-end(フロントエンド),Dialogue Manager(対話制御部), Documents Server(ドキュメントサーバ)から構成される. ドキュメントサーバは,一般的なWebサーバである.XISL,XML,およびその他のドキュメント(XSLで記 述されたスタイルシートなど)を保持し,これらのドキュメントを必要に応じて対話制御部に提供する. 対話制御部ではXISLをはじめとする各ドキュメントを解釈し,対話の進行状況を管理すると同時に,入出 力の制御を行なう.フロントエンド部は端末部分であり,音声認識・合成エンジンやブラウザ等を用いて 入出力処理を行なう.理想的には対話制御部は端末に非依存になるよう実装し,移植性を高くすることが 望ましい.

XISL実行システムのアーキテクチャ

図 2 : XISL実行システムのアーキテクチャ

3. XISLの目標

XISLの主な目標は,

  1. 入出力モダリティの異なる様々なフロントエンド(携帯電話,PC,デジタルTV etc.) の利用を可能にし,シームレスなWebサービスを実現すること,
  2. 複雑なマルチモーダル対話を容易に記述できるようにすること,
  3. コンテンツと対話の分離により双方の再利用性を高めること
  4. ユーザ主導,システム主導,混合主導の対話が記述できること,

である.1を可能とするために,XISLは入出力モダリティを任意に拡張できる自由度を持つ. 2を実現するために,XISLには,並行的,逐次的,択一的な対話の進行,割込み対話,条件処 理,繰り返し処理,簡単な演算処理,XMLドキュメントへの読み書き等を実行するための命令 が用意されている.3を可能とするために,XISLはXMLコンテンツから分離させ,対話のみを記 述する構造をとっている.4を可能とするために,ユーザへのプロンプトを出力する対話と, 出力しない対話の双方が記述できるようになっている.

4. XISLの範囲

XISLは任意のXML要素とユーザとのインタラクションを記述するための言語である. XML要素は何らかの形でユーザに提示されており(画面上に表示されている,あるいは,ハード として提供されている),それに対してユーザが何らかの操作を実行することによって,対話が 進行する.システムとしては,一般的には,パーソナルコンピュータが想定できるが,XISLでは 特定のシステムを対象とせず,利用モダリティも制限しない.(例えば様々な感知センサを入力 モダリティとして持ち,出力として3次元的な動作を行なうロボットを想定することも可能である.)

5. 対話レベル

XISLは,セッション,アプリケーション,ドキュメント,ダイアログ,エクスチェンジの5つの 対話レベルを持つ.これらは上記の順に階層関係になっている.ユーザは常に一つのダイアログ を実行していることになり,同時に,そのダイアログを含むドキュメント,アプリケーション, セッションを実行していることになる.また,ユーザは,ダイアログに含まれる一つのエクスチ ェンジの実行状態,もしくは一つ以上のエクスチェンジの待機状態にある.セッションおよびエ クスチェンジを除く全てのレベルの対話に遷移でき,セッションを除く全てのレベルで変数を設 定できる.対話レベルの関係を図 3に示す.

対話レベル

図 3 : 対話レベルの関係

5.1. エクスチェンジ

エクスチェンジには,ユーザとシステムとの対話の最小単位であるインタ ラクションが記述される.エクスチェンジには2種類の記述方法がある.一つは,XML要素に対 するユーザの操作を最初に記述し,それらの入力に対するシステムの動作を続いて記述する方 法である.これはユーザ主導の対話を記述する際に用いる.もう一つは,ユーザに入力を促す ためのシステムの出力をまず記述し,続いてユーザの操作を,最後にシステムの動作を記述す る方法である.これはシステム主導の対話を記述する際に用いる.

5.2. ダイアログ

ダイアログはエクスチェンジの集合であり,一組の対話が記述される.ユー ザは常に1つのダイアログを実行していることになる.ダイアログ内に列挙されたエクスチェン ジは,対話制御に関する記述がない限り,記述された順に実行される.ダイアログ内では,次に 遷移するダイアログを指定できる.

各ダイアログは,ダイアログレベル,ドキュメントレベル,アプリケーションレベルのいずれか のレベルに属する.ダイアログレベルのダイアログは,明示的にそのダイアログが遷移先として 指定されたときにのみ実行できる.つまり,遷移先として指定されない限り実行されることはない.

5.3. ドキュメント

ドキュメントはダイアログの集合であり,一つのXISLファイルに相当する. 各XISLドキュメントではドキュメントレベルの変数,およびダイアログを宣言できる.ドキュメン トレベルの変数はそのドキュメントの実行中,アクセス可能であり,他のドキュメントに移った時 にアクセス不可能になる.ドキュメントレベルのダイアログはそのドキュメントの実行中,常時実 行可能であり,任意の時点でそのダイアログに遷移できる.他のドキュメントに移った時,元のド キュメントレベルのダイアログは実行不可能になる.

5.4. アプリケーション

アプリケーションは一つのタスクを遂行するためのドキュメントの集合である. 一つのアプリケーションには,一つのアプリケーションルートドキュメントと,0個以上のリーフド キュメントが含まれる.アプリケーションルートドキュメントではアプリケーションレベルの変数, およびダイアログを宣言できる.

一つのアプリケーションの実行中,必ず一つのドキュメントが実行される.リーフドキュメントが実 行される場合には,同時にアプリケーションルートドキュメントが読み込まれ,アプリケーションレ ベルの変数やダイアログが利用可能になる.

アプリケーションレベルの変数はそのアプリケーションの実行中,アクセス可能であり,アプリケーシ ョン外のドキュメントに移った時にアクセス不可能になる.アプリケーションレベルのダイアログはそ のアプリケーションの実行中,常時実行可能であり,任意の時点でそのダイアログに遷移できる. アプリケーション外のドキュメントに移った時,元いたアプリケーションのアプリケーションレベルの ダイアログは実行不可能になる.

5.5. セッション

セッションは,ユーザがXISL実行システムに接続した時に始まる.XISLドキュメント を読み込み,対話を進行,遷移させながら継続し,ユーザ,XISL実行システムのいずれかの要求によって 終了する.

6. XISL構成要素

要素 目的 参照
<action> システムの動作,ユーザへの出力を行なう. 13.
<alt_exchange> 複数の<exchange>を囲み,択一的な対話の流れを作る. 10.3.
<alt_input> 複数の<input>を囲み,択一的な入力の組み合わせを記述する. 12.3.
<assign> 値を変数に割り当てる. 15.
<author> 著者名を記述する. 7.1.
<begin> <dialog>の導入処理を記述する. 10.2.
<body> 対話内容を記述する. 7.1.
<call> 他のダイアログへ遷移する. 18.1.
<case> 属性valueの値と,<switch>の属性 exprの値とが一致した場合に行う処理を記 述する. 16.2.
<date> 更新日を記述する. 7.1.
<details> 詳細情報を記述する. 7.1.
<delete_element> 指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれる任意のXML要素を削除する. 26.
<dialog> 一組の対話を記述する. 10.1.
<dialog_var> ダイアログ変数を宣言する. 8.5.
<document_var> ドキュメント変数を宣言する. 8.4.
<else> 親要素である<if>,または<elseif>の属性condで指定された論理式が,偽の場合実行される. 16.1.
<elseif> 条件処理を行う. 16.1.
<exchange> ユーザとの対話の最小単位を記述する. 10.2.
<exit> 実行中のダイアログ,ドキュメント,アプリケーションを終了する. 20.
<get_attribute> 指定したXMLドキュメント,もしくは変数に格納されているXML要素から任意のXML要素の属性値を取得する. 24.3.
<get_element> 指定したXMLドキュメント,もしくは変数に格納されているXML要素から任意のXML要素を取得する. 24.1.
<get_value> 指定したXMLドキュメント,もしくは変数に格納されているXML要素から任意のXML要素の内容を取得する.
ただし,XML要素の直接の子供となる内容のテキストデータのみを取得する.
24.2.
<goto> 他のダイアログへ遷移する.ただし元の対話への復帰はできない. 18.3.
<head> XISLドキュメントに関するメタ情報を記述する. 7.1.
<history> 更新履歴を記述する.内部に<item>を含む. 7.1.
<if> 条件処理を行う. 16.1.
<input> ユーザの1入力を記述する. 12.2.
<item> 一つの更新履歴を記述する.内部に<date>,<details>を含む. 7.1.
<name> 対話の名前を記述する 7.1.
<operation> ユーザから受け付ける入力を記述する. 12.1.
<other> 全ての<case>が実行されなかった場合の処理を記述する. 16.2.
<output> ユーザへの1出力を記述する. 23.
<par_exchange> 複数の<exchange>を囲み,並行的な対話の流れを作る. 10.3.
<par_input> 複数の<input>を囲み,平行入力の組み合わせを記述する. 12.3.
<par_output> 複数の<output>を囲み,同時出力を行う. 23.
<prompt> ユーザに入力を促すための出力を記述する. 11.
<reprompt> <exchange>内の<prompt>を再実行する. 11.
<return> 呼び出し元のダイアログへ戻る. 18.2.
<seq_exchange> 複数の<exchange>を囲み,逐次的な対話の流れを作る. 10.3.
<seq_input> 複数の<input>を囲み,逐次的な入力の組み合わせを記述する. 12.3.
<seq_output> 複数の<output>を囲み,逐次的な出力を行う. 23.
<set_attribute> 指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれ る任意のXML要素の属性値を更新する. 25.3.
<set_element> 指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれ る任意のXML要素を更新する. 25.1.
<set_value> 指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれ る任意のXML要素の内容を更新する. 25.2.
<submit> 変数の値をHTTP GETまたはPOSTリクエスト経由でドキュメントサーバに送信し,戻り値を受信する. 19.
<switch> 条件分岐を行う. 16.2.
<then> 親要素である<if>,または<elseif>の属性condで指定された論理式が,真の場合実行される. 16.1.
<var> 変数を宣言する. 8.1.
<value> <output>内に変数の値を埋め込む. 22.
<while> 属性condに記述される論理式の値が真である間,<while>内の処理を行なう. 17.
<xisl> XISLドキュメントのルート要素 7.1.

7. XISLドキュメントの構造と実行

7.1. ドキュメントの構造

XISLはXML文書である.XISLの利用者はXML1.0で定義されている概念と用語に馴染ん を期待される.XISLの文法は付録1.のDTDによって定義される.XISLの基本構造を以 下に示す.

<?xml version="1.0" encoding="Shift-JIS"?>
<!DOCTYPE xisl SYSTEM "./xisl.dtd">
<xisl version="1.0">
   <head>
      --title, author, history, etc. --  
   </head>
   <body>
      --contents--
          ・
          ・
   </body>
</xisl>
         

XISLのルート要素は<xisl>であり,内部には子要素である<head>と <body>を,この順に記述する. 属性versionは必須であり,XISLのバージョンを 指定する.本仕様のXISLのバージョンは"1.0"である. 属性applicationにはアプリケーションルートド キュメント(7.2節参照)のURIを指定する.指定したドキュ メントが存在しなければ実行時エラーになる.<head>には,製作者,更新履 歴などの,対話とは直接関係のないドキュメントのメタ情報を記述し, <body>には,対話の内容を記述する.

要素 <xisl>
目的 XISLドキュメントのルート要素
属性 version XISLのバージョンを指定する.本バージョンは"1.0"である.
application アプリケーションルートドキュメントのURIを指定する.


要素 <body>
目的 対話内容を記述する.
属性 なし.

<head>の記述例を以下に示す.

<head>
   <name> OnLine Shopping System </name>
   <author> Takanori Kobayashi </author>
   <date> Dec.26 2001 </date>
   <details> Version 1.0 </details>
   <history>
      <item>
         <date> Jun.18 2001 </date>
         <details> Version 0.0 </details>
      </item>    
       ・
       ・
   </history>
</head>
         

<head>内の各記述は以下の目的を持つ.

要素 <author>
目的 著者名を記述する.
属性 なし.

要素 <date>
目的 更新日を記述する.
属性 なし.

要素 <details>
目的 詳細情報を記述する.
属性 なし.

要素 <history>
目的 更新履歴を記述する.内部に<item>を含む.
属性 なし.

要素 <item>
目的 一つの更新履歴を記述する.内部に<date>,<details>を含む.
属性 なし.

要素 <name>
目的 対話の名前を記述する.
属性 なし.

<body>にはユーザ−システム間の対話とその制御,その他の処理を記述する. <body>は<document_var>(8.4節参照)と <dialog>を子要素として持つ. ドキュメントは,最初の<dialog>から実行される.遷移先が指定されずに <dialog>の実行が終了したとき,ダイアログ,ドキュメント,アプリケーショ ンの実行が終了する.

<body>
   <document_var>
      --Declaration of document variables--
   </document_var>
   <dialog> 
      --A unit of dialogue-- 
   </dialog>
      ・
      ・
</body>
         

7.2. アプリケーションとその実行

アプリケーションルートドキュメントとリーフドキュメントの区別は,<xisl>の 属性applicationにURIが記述されているかどうかで行 なう.属性applicationにアプリケーションルートドキ ュメントのURIが指定されているとき,そのドキュメント自身はリーフドキュメントであ り,URIで指し示されるドキュメントがアプリケーションルートドキュメントである. 属性applicationにURIが指定されていないとき,そのド キュメント自身がアプリケーションルートドキュメントである.1つのアプリケーション を複数のドキュメントによって構成する場合には,まず1つのドキュメントをアプリケー ションルートドキュメントとして選択し,そのURIを他のドキュメントの 属性applicationに記述すればよい.

XISLインタプリタは,アプリケーション内のドキュメントを読み込む度に,アプリケーシ ョンルートドキュメントが既に読み込まれているかどうかチェックする. アプリケーションルートドキュメントが読み込まれていないなら,それを読み込む.アプ リケーションルートドキュメントは,アプリケーションが変化しない限り読み込まれたま まになっている.したがって下記の2つの条件のうち1つは,処理の間,常に成立する.

  1. アプリケーションルートドキュメントが読み込まれ,それを実行している.
  2. アプリケーションルートドキュメントとリーフドキュメントが共に読み込まれ,リーフドキュメントを実行している.

複数ドキュメントからなるアプリケーションには2つの利点がある.1つは,アプリケーショ ンレベルの変数をアプリケーション内の他のドキュメントで使用できることである. これにより同一アプリケーション内での情報の共有と保持が可能になる.もう1つは,ユーザ がリーフドキュメントにいるときでも,アプリケーションレベルのダイアログが常時実行可 能になることである.これにより同一アプリケーション内での共通の割り込み処理が記述で きるようになる.

以下に2つのドキュメントからなるアプリケーションの例を示す.

app-root.xisl (root document)
<?xml version="1.0" encoding="Shift-JIS"?>
<!DOCTYPE xisl SYSTEM "xisl.dtd">
<xisl version="1.0">
   <head> …… </head>
   <body>
      <dialog id="Help" scope="document">
         <exchange>
            <operation target="help.grxml">
               <input type="speech" event="recognize" match="/grammar/rule[@id=help]" />
            </operation>
            <action>
               <output type="speech" event="tts-speech">
                  <![CDATA[
                     <param name="speech_text"> Click the Page! </param>
                  ]]>
               </output>
            </action>
         </exchange>
      </dialog>
   </body>
</xisl>
         
hello.xisl (leaf document)
<?xml version="1.0" encoding="Shift-JIS"?>
<!DOCTYPE xisl SYSTEM "xisl.dtd">
<xisl version="1.0" application="app-root.xisl">
   <head> …… </head>
   <body>
      <dialog id="Hello World">
         <exchange>
            <operation target="hello.xml">
               <input type="touch" event="click" match="/page" />
            </operation>
            <action>
               <output type="speech" event="tts-speech">
                  <![CDATA[
                     <param name="speech_text"> Hello World! </param>
                  ]]>
               </output>
            </action>
         </exchange>
      </dialog>
   </body>
</xisl>
      

この例では,hello.xislがリーフドキュメントとして実行されることを想定している. hello.xislの<xisl>の属性applicationには app-root.xislがアプリケーションルートドキュメントとして指定されている. app-root.xislでは,<dialog>の属性scopedocumentになっている.これはダイアログ「Help」が アプリケーションレベルで宣言されていることを意味する.したがってユーザの「Help」 に関する発話はそのアプリケーション全体で常に受け付けられることになる. <dialog>タグの属性scopeとダイアログのレベル の詳細な関係については10.1節を参照されたい.

7.3. ダイアログの遷移とアプリケーションの変化

<goto>もしくは<call>によってダイアログが遷移する場合,アプリケーションが変化 するときと,変化しないときがある.また遷移によってドキュメントが変化する場合 がある.以下にダイアログの遷移とアプリケーション,ドキュメントの変化の関係を 示す.また,図 4にダイアログの遷移とアプリケーションの変化の関係を示す.

●ドキュメントが変化しない遷移
実行中のダイアログを含むドキュメントと,遷移先のダイアログを含むドキュ メントが同じであるとき,ドキュメントは変化しない.
●ドキュメントが変化する遷移
実行中のダイアログを含むドキュメントと,遷移先のダイアログを含むドキュ メントが異なるとき,ドキュメントは変化する.
●アプリケーションが変化しない遷移
アプリケーションが変化しない遷移は,以下いずれかに当てはまるダイアログ の遷移である.
  • 実行中のダイアログのアプリケーションルートドキュメントと,遷移先の ダイアログのアプリケーションルートドキュメントが同じである.
  • 実行中のダイアログがドキュメントDに含まれ,遷移先のダイアログのアプ リケーションルートドキュメントがDである.
  • 実行中のダイアログのアプリケーションルートドキュメントがドキュメント Dであり,遷移先のダイアログがDに含まれる.
  • 実行中のダイアログがアプリケーションルートドキュメントDに含まれ,遷移 先のダイアログもDに含まれる.
アプリケーションが変化する遷移
上記のアプリケーションが変化しない遷移に当てはまらないダイアログの遷移は, アプリケーションを変化させる.
ダイアログの遷移とアプリケーションの変化の関係

図 4 : ダイアログの遷移とアプリケーションの変化の関係

8. 変数

8.1. 変数宣言 - var

変数は,<var>要素により宣言される.属性nameは必須属性で あり,宣言する変数の名前を記述する.属性exprには初期値を指定 する.変数名の命名規則は,ECMAScriptの変数の命名規則に準拠する. 変数名の指定は必須であるが,初期値の指定は任意とする.初期値を指定しない場合のデフォルト値 は,ECMAScriptのundefined値とする. スコープがsessionlocal (8.2節参照)の変数を除き,使用前に必ず宣言しなければならない.

<var name="home_phone"/>
<var name="one" expr="1"/>
<var name="person" expr="'Yusaku Nakamura'"/>
         
要素 <var>
目的 変数を宣言する.
属性 name 変数の名前を記述する.
expr 変数の初期値を指定する.

8.2. 変数のスコープ

変数は以下のスコープに対して宣言できる.

スコープ 概要
session セッション全体で有効な変数であり,セッション内の任意のダイアログからアクセス可能である. 対話制御部で予め宣言されており,新しいセッション変数をXISLドキュメントで宣言することはで きない.
application アプリケーション全体で有効な変数であり,アプリケーション内の任意のダイアログからアクセス 可能である.アプリケーションルートドキュメント中の<document_var>内の<var>に よって宣言される.アプリケーション変数は,アプリケーションルートドキュメントが読み込まれ たときに初期化され,アプリケーションルートドキュメントが読み込まれている間アクセスできる.
document ドキュメント全体で有効な変数であり,ドキュメント内の任意のダイアログからアクセス可能である. XISLドキュメント中の<document_var>内の<var>によって宣言される. ドキュメント変数はドキュメントが読み込まれたときに初期化され,当該ドキュメントが読み込まれて いる間アクセスできる.
dialog ダイアログ全体で有効な変数であり,そのダイアログ内の各要素からアクセス可能である. <dialog_var>内の<var>により宣言される.また,<dialog>の 属性argで指定された引数は,ダイアログ変数として扱われる. ダイアログ変数はダイアログの実行が始まったときに初期化され,当該ダイアログが実行されている間 アクセスできる.
local <begin>,<end>,<exchange>内で閉じたスコープをもつ変数であり,ぞれぞれの 要素内からのみアクセス可能である.変数宣言は特に必要としないが, <var>で行なう事も可 能である.ローカル変数は<begin>,<end>,<exchange>内で宣言もしくは新規に 検出されたときに初期化され,当該<begin>,<action>,<exchange>が実行されて いる間アクセスできる.

8.3 変数参照

属性condexprnamelist,およびmatch では変数を参照できる.属性condexprnamelist内では, 変数名によって参照し,属性match内では,"$変数名"によ り変数を参照する.未定義の変数を参照した場合には,実行時エラーとなる.

  1. 属性condexprnamelistでの変数参照の例
    <if cond="person =='Yusaku Nakamura'">
       <assign name="character" expr="'kind'"/>
    </if>
                   
    <assign name="new" expr="x+y"/>
                   
    <return namelist="person, character"/>
                   
  2. 属性matchでの変数参照の例
    <input  match="/personal/item[@name="$person"]"  
             type="touch" event = "click"  />
                   

XISLでは,スコープが異なる場合に限って,同じ名前の変数を宣言できる. ただし,セッション変数と同じ名前の変数は宣言できない.スコープが同 じであり,かつ同じ名前の変数が宣言された場合には,実行時エラーとな る.またセッション変数と同じ名前の変数宣言を行なった場合も,実行時 エラーとなる.

同じ変数名が存在したときは,スコープの小さい方の変数(よりローカル 側の変数)を優先して参照する.スコープの大きい方の変数を参照したい 場合には,下に示すように,"スコープ.変数名"の形式を用いる.(変数 のスコープを明確化するために"スコープ.変数名"を用いてもよい.)

session.X セッション変数
application.X アプリケーション変数
document.X ドキュメント変数
dialog.X ダイアログ変数
local.X ローカル変数

8.4. アプリケーション変数とドキュメント変数

ドキュメント変数はXISLドキュメント中の<document_var>内の<var> で宣言する.アプリケーションルートドキュメントで宣言したドキュメント変数は, アプリケーション全体で有効なアプリケーション変数となる.

<body>
   <document_var>
      <var name="user_ID"/>
      <var name="max_items" expr="15"/>
         ・
         ・
   </document_var>
      ・
      ・
</body>
         
要素 <document_var>
目的 ドキュメント変数を宣言する.
属性 なし.

8.5. ダイアログ変数

ダイアログ変数は<dialog>の最初の子要素である<dialog_var> 内の<var>で宣言する.また<dialog>の属性argの属性値である 引数はダイアログ変数として宣言されたものとして扱われる.

<dialog id="sample" arg="person,character,・・・">
   <dialog_var>
      <var name="num_of_items"  expr="24" />
      <var name="greeting_word"  expr="'HELLO'" />
            ・
            ・
   </dialog_var>
      ・
</dialog>
         
要素 <dialog_var>
目的 ダイアログ変数を宣言する.
属性 なし.

8.6. ローカル変数

ローカル変数は,<begin>,<exchange>,<end>内で有効な変数である. ローカル変数の宣言は特に必要としないが,<begin>,<exchange>, <end>内の子要素である<var>で行なう事も可能である.<begin>の子要 素として宣言した変数は,<begin>内で有効な変数であり,他の<exchange>, <end>で宣言した場合も同様に,各要素内で有効な変数となる.

<exchange>
   <operation>
      <input  type="speech" event="recognize" target="number.grxml"match="/grammar/rule[@id=number]" return="num"/>
   </operation>
   <action>
      <var name="price" expr="150" />
      <assign name="sum" expr="num * price"/>
         ・
         ・
   </action>
</exchange>
         

8.7. セッション変数

XISLには,以下のセッション変数が予め準備されている. 値を明示的に更新するまでは,対話制御部が設定したデ フォルト値が格納される.

TIMEOUT 入力のタイムアウト時間を設定する変数.単位は[msec].
ERROR 正常状態では0,実行時エラーが起きるとエラー番号が格納される.
<exchange>
   <prompt>
      ・
      ・
   </prompt>
   <operation>
      <input  type="speech" event="recognize" target="number.grxml"match="/grammar/rule[@id=number]" return="num"/>
   </operation>
   <action>
      <if cond="ERROR != 0">
         <then>
            <reprompt/>
         </then>
      ・
      ・
      </if>
   </action>
</exchange>
      

9. 式

XISLでは,四則演算(整数のみ),文字や数値の大小比較,AND,OR,NOTの論理演算を, 属性condexpr内で 記述できる.式は以下の文法に従う.

計算式 ::= 項 { {'+'|'-'} 項 }*
::= 因子 { {'*'|'/'| '%'} 因子 }*
因子 ::= 数値 | 変数 | '(' 計算式 ')' | '-' 因子 | '+'因子
条件式 ::= and式 ('||' and式)*
and式 ::= 論理式 ('&&' 論理式)*
論理式 ::= '(' 条件式 ')' | '!' 論理式 | 比較式 | '1' | 'true' | '0' | 'false'
比較式 ::= 計算式 {'=='|'!='|'<'|'>'|'<='|'>='} 計算式 | 文字列 {'=='|'!='|'<'|'>'|'<='|'>='} 文字列
数値 ::= ( 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 ) +
文字列 ::= ' シングルクゥオートを含まない全ての文字* '
変数 ::= ECMAScriptで宣言可能な変数名

算術演算子
算術演算子 意味
+ 加算
- 減算
* 乗算
/ 整数除算
% 剰余

論理演算子
論理演算子 意味
&& 論理積
|| 論理和
! 否定

関係演算子
関係演算子 意味
== 等しい
!= 等しくない
< より小さい
<= より小さいか等しい
> より大きい
>= より大きいか等しい

10. 対話の記述

<dialog>は<body>の子要素であり,一組の対話を記述する. <dialog>は<begin>(最初に実行される処理ユニット),複数 の<exchange>(対話の最小単位),<end>(最後に実行される 処理ユニット)の順に記述する.

<exchange>は,XISLで記述できる対話の最小単位であり,ユーザに入力を 促すためのシステムの出力を記述する<prompt>,ユーザからの受け付ける 入力を記述する<operation>,受け付けた入力に対するシステムの処理・出 力を記述する<action>の順に記述する.まず<dialog>の記述例を示す.

<body>
   <dialog  id="order" comb="seq" repeat="1" scope="dialog" arg="x">
      <begin>
         <output type="mmi-browser" event="open">
            <![CDATA[
            <param name="window-name">order_page</param>
            <param name="uri"> burger.xml</param>
            ]]>
         </output>
         <output type="speech" event="tts-speech">
            <![CDATA[
            <param name="speech_text">May I help you?</param>
            ]]>
         </output>
      </begin>
      <exchange>
         <operation target="burger.xml">
            <input type="touch" event="click" match="/hamburger"/>
            <input  type="speech" event="recognize" target="burger.grxml"match="/grammar/rule[@id=order]" />
         </operation>
         <action>
            <output type="speech" event="tts-speech">
               <![CDATA[
               <param name="speech_text">
                  O.K. You ordered a hamburger.
               </param>
               ]]>
            </output>
         </action>
      </exchange>
   </dialog>
</body>
      
S : [Display hamburger.xml] (modality : display)
May I help you? (modality : speech)
U : This burger please. (modality : speech, grammar : burger.grxml)
[Push the button "hambueger"] (modality : touch_panel)
S : O.K. You ordered a hamburger. (modality : speech)

<dialog>(一組の対話)は,基本的に以下の流れで進行する.

  1. 対話の初期処理(<begin>の実行)を行う.
  2. <exchange>を属性combに従って実行していく.
  3. 属性repeatで繰り返しが指定されていれば2の処理に戻る.
  4. 対話の終了処理(<end>内の実行)を行う.

<end>の処理が終了するまでに別<dialog>への遷移命令(<call>や<goto>) がなければ,<end>の処理が終了した時点でダイアログ,ドキュメント,アプリケーションの 実行が終了する.また<begin>内や<exchange>の<action>内で,別<dialog> への遷移命令があれば,<end>の処理は実行せず,指定された<dialog>に遷移する.

10.1. 一組の対話 - dialog

<dialog>は,属性idcombrepeatscopeargの各属性を持つ.属性idは, 必須属性であり,対話名を記述する.対話名はドキュメント内でユニークなものとする.ドキュメ ント内で重複した対話名が存在した場合,実行時エラーとなる.

属性combでは対話の流れを指定する.流れの種類は図 5に示すように, "seq","par","alt"の3種類がある.明示的に記述しない場合は,"seq"が指定されたとみなす.

図5 : <dialog>の属性combの記述
属性値 対話の流れ
seq seq

まず<begin>を実行し,続いて<exchange>を記述された順に実行. 全ての<exchange>の処理が終われば,<end>に移る.

par par

まず<begin>を実行し,続いて<exchange>を任意の順に実行. 全ての<exchange>の処理が終われば,<end>に移る.

alt alt

まず<begin>を実行し,続いてどれか1つの<exchange>を実行. その<exchange>の処理が終われば,<end>に移る.

属性repeatでは対話を繰り返す回数を指定する. 明示的に記述しない場合は,1が指定されたものとみなす.また無限に繰り返す 場合は"*"を指定する.なお繰り返しの対象は<exchange>のみであり, <begin>,<end>は繰り返しの対象ではない.

属性scopeでは対話レベルを指定する. "dialog","document"のいずれかを指定できる."dialog"が指定された<dialog>は, ダイアログレベルの対話であり,後述する<call>や<goto>(18節参照)等で 明示的にその対話が遷移先として指定されたときにのみ実行される.つまり,遷移先とし て指定されない限り,実行されることはない. 一方,"document"が指定された<dialog>は,ドキュメントレベルの対話であり,同じ ドキュメント内の別の<dialog>が実行中であっても,常時実行可能である.この様な <dialog>を割り込み対話といい,割り込み対話を実行するきっかけになる入力を割り 込み入力という.割り込み入力は,割り込み対話の<begin>に続いて実行可能な <exchange>内の<operation>である.ある<dialog>を実行中に割り込み入 力があった場合,実行中の<dialog>を一時,停止状態にする.次に入力を受け付けた 割り込み対話を実行状態にし,割り込み対話の処理を進める.この時,入力を受け付けた <exchange>から実行し,その割り込み対話内の<begin>は実行されない.その後 の処理は,10節の1〜4に示した<dialog>の基本的な流れと同じ である.ドキュメントレベルの対話のうち,特に,アプリケーションルートドキュメント内の 対話は,アプリケーションレベルの対話であり,そのアプリケーション実行中に常時実行可能 である.属性scopeを明示的に記述しない場合は"dialog"が指 定されたものとみなす.

属性argでは,<call>や<goto>によりこの <dialog>に遷移した時に,<dialog>が受け取る変数を指定する.変数は","で区 切って列挙する.属性argに列挙された変数の個数と, <call>,および<goto>の属性namelistに列挙され た変数の個数が一致しない場合,実行時エラーになる.

要素 <dialog>
目的 1組の対話を記述する.
属性 id 対話名を記述する.
comb <dialog>内の<exchange>の流れを記述する. "seq","par","alt"のいずれかの値をとる. デフォルト設定は"seq"である.
repeat 対話の繰り返し回数を記述する. 1以上の整数もしくは"*"(無限大を表す)のいずれかの値をとる. デフォルト設定は"1"である.
scope 対話レベルを指定する."dialog","document"のいずれかの値をとる. デフォルト設定は"dialog"である.
arg 対話に引き渡される引数を列挙する.複数の引数は","で区切る.

10.2. 対話の最小単位 - begin, exchange, end

<dialog>は対話の最小単位を表す<begin>,<exchange>,<end>から構成される. <begin>には対話の導入処理を,<exchange>にはユーザとの対話の最小単位を,<end> には対話の終了処理を記述する.

<begin>,<end>には後述する<action>とほぼ同じ内容が記述できる (<reprompt>のみが記述できない). <exchange>は表 1に示すように,2種類の方法で記述できる.

表1 : <exchange>の記述方法
ユーザ主導型<exchange>の記述
  1. XML要素に対するユーザの操作を記述
  2. システムの動作を記述
システム主導型の<exchange>の記述
  1. ユーザに入力を促すためのシステムの出力を記述
  2. XML要素に対するユーザの操作を記述
  3. システムの動作を記述

ユーザ主導型の<exchange>は,XML要素に対するユーザの操作と, それに対 するシステムの動作に関する記述からなる.一方,システム主導型の<exchange>は, ユーザに入力を促すためのシステムの出力,それを受けたユーザの操作,それに対するシス テムの動作に関する記述からなる.ユーザ主導型の<exchange>の記述例を 図 6に,システム主導型の<exchange>の記述例を 図 7にそれぞれ示す.

<exchange>
   <operation target="burger.xml">
      <input type="touch" event="click" match="/hamburger"/>
      <input  type="speech" event="recognize" target="burger.grxml"match="/grammar/rule[@id=order]" />
   </operation>
   <action>
      <output type="speech" event="tts-speech">
         <![CDATA[
         <param name="speech_text">O.K. You ordered a hamburger.</param>
         ]]>
      </output>
   </action>
</exchange>
         

図6 : ユーザ主導型の<exchange>の記述例

S : This burger please. (modality : speech, grammar : burger.xml)
[Push the button "hambueger"] (modality : touch_panel)
S : O.K. You ordered a hamburger. (modality : speech)
<exchange>
   <prompt>
      <output type="speech" event="tts-speech">
         <![CDATA[
         <param name="speech_text">Would you like a hamburger?</param>
         ]]>
      </output>
   </prompt>
   <operation target="burger.xml">
      <input  type="speech" event="recognize" target="yes.grxml"match="/grammar/rule[@id=yes]" />
   </operation>
   <action>
      <output type="speech" event="tts-speech">
         <![CDATA[
         <param name="speech_text">O.K. You ordered a hamburger.</param>
         ]]>
      </output>
   </action>
</exchange>            
         

図7 : システム主導型の<exchange>の記述例

S : Would you like a hamburger? (modality : speech)
U : Yes. (modality : speech, grammar : yes.grxml)
S : O.K. You ordered a hamburger. (modality : speech)
要素 <begin>
目的 <dialog>の導入処理を記述する.
属性 なし.
要素 <exchange>
目的 ユーザとの対話の最小単位を記述する.
属性 なし.
要素 <end>
目的 <dialog>の終了処理を記述する.
属性 なし.

10.3. 複雑な対話の流れ - seq_exchange, par_exchange, alt_exchange

<dialog>の属性combでは,図 5に示すような<exchange>の流れを指定できる. これに加えて,XISLでは,局所的に逐次,並行,あるいは択一を指定するための要素も用意している.

これらの要素の使用例を以下に示す.

<dialog comb="alt">

   <seq_exchange>

      <exchange>
         <operation target="burger.xml">
            <input type="touch" event="click" match="/hamburger"/>
         </operation>
         <action>
            <output type="speech" event="tts-speech">
               <![CDATA[
               <param name="speech_text">How many?</param>
               ]]>
            </output>
         </action>
      </exchange>

      <exchange>
         <operation>
            <input  type="speech" event="recognize" 
                  target="burger.grxml"match="/grammar/rule[@id=number]" />
         </operation>
         <action>
            <output type="speech" event="tts-speech">
               <![CDATA[
               <param name="speech_text">O.K.</param>
               ]]>
            </output>
         </action>
      </exchange>

   </seq_exchange>
   
   <exchange>
      <operation>
         <input  type="speech" event="recognize" 
               target="burger.grxml"match="/grammar/rule[@id=order]" />
      </operation>
      <action>
         <output type="speech" event="tts-speech">
            <![CDATA[
            <param name="speech_text">O.K.</param>
            ]]>
         </output>
      </action>
   </exchange>

</dialog>
         
U : [Push the button "hambueger"] (modality: touch_panel)
S : How many? (modality : speech)
U : Two. (modality : speech)
S : O.K. (modality : speech)
or
U : Two hamburgers, please. (modality : speech)
S : O.K. (modality: speech)
要素 <seq_exchange>
目的 複数の<exchange>を囲み,逐次的な対話の流れを作る.
属性 なし.
要素 <par_exchange>
目的 複数の<exchange>を囲み,並行的な対話の流れを作る.
属性 なし.
要素 <alt_exchange>
目的 複数の<exchange>を囲み,択一的な対話の流れを作る.
属性 なし.

11. ユーザに入力を促すためのシステムの出力 - prompt, reprompt

<prompt>は,システム主導型の<exchange>において,ユーザに対して入力を促すために用いられる. 内部に複数の<output>を含む.また,<reprompt>は<exchange>内の<prompt>を再実行するために使 用する.<exchange>内に<prompt>を記述せずに<reprompt>を記述した場合には,実行時エラーとなる.

1つの<exchange>には属性<span class="element">count</span>の値が異なる<prompt>を列挙できる. このとき最初に実行される<prompt>は<span class="element">count</span>の値が1のもの(あるい は<span class="element">count</span>が指定されていないもの)である.その後,<exchange>内の <reprompt>が実行されたとき,<prompt>が再び実行される.<prompt>の再実行が繰り返され, 別の<prompt>の属性<span class="element">count</span>で指定された回数繰り返された(繰り返しの 回数と<span class="element">count</span>の値が一致した)とき, それ以降は<span class="element">count</span>の回数が一致した<prompt>が実行される.

属性timeoutには<prompt>を自動的に繰り返す際の間隔をミリ秒で記述する. 属性timeoutに何らかの値が指定されている場合にユーザの入力がなかった場合, 属性timeoutに指定された時間ごとに<prompt>が繰り返される. 属性bargeinでは,<prompt>の実行中にユーザの入力があった場合に,プロン プトを中断すべきかどうか指定する.中断してもよい場合には"true"を,中断してはならない場合には"false"を記述 する.

以下に<prompt>の記述例を示す.

<exchange>
   <prompt>
      <output type="speech" event="tts-speech">
         <![CDATA[
            <param name="speech-text">
               Please input the title of the book you want to buy.
            </param>
         ]]>
      </output>
      <output type="timer" event="create">
         <![CDATA[
            <param name="timer-id">noinput</param>
            <param name="interval"> 60000 </param>
         ]]>
      </output>
   </prompt>
   <prompt count="3" timeout="60000">
      <output type="speech" event="tts-speech">
         <![CDATA[
         <param name="speech-text">Title please.</param>
         ]]>
      </output>
   </prompt>
   <operation comb="alt">
      <!-- Waiting for the input of user's speech.-->
      <input  type="speech" event="recognize" 
            target="book.grxml"match="/grammar/rule[@id=title]"  return="result"/>
      <!-- Waiting for the input of "noinput". -->
      <input  type="timer" event="timeout" 
            target="book.xml"match="/page"  return="result"/>
   </operation>
   <action>
      <!-- "noinput"? -->
      <if cond="result == 'noinput'">
         <!-If the value of cond is true, the prompt is executed again. -->
         <then>
            <output type="timer" event="destroy">
               <![CDATA[
                  <param name="timer-id">noinput</param>
               ]]>
            </output>
            <reprompt/>
         </then>
         <else>
            <output type="speech" event="agent-speech">
               <![CDATA[
                  <param name="speech-text">O.K. You ordered a book.</param>
               ]]>
            </output>
         </else>
   </action>
</exchange>
      
S : Please input the title of the book you want to buy. ( modality : speech )
U : [ noinput 60s ] ( modality : timer )
S : Please input the title of the book you want to buy. ( modality : speech )
U : [ noinput 60s ] ( modality : timer )
S : Title, please. ( modality : speech )

要素 <prompt>
目的 ユーザに入力を促すための出力を記述する.
属性 count 当該<prompt>の実行のタイミングを整数値で記述する. デフォルト設定は"1".
timeout 自動的に<reprompt>を実行する間隔(ミリ秒)を記述する.
bargein ユーザがプロンプトを中断できるかどうかを指定する. デフォルト設定は"true".

要素 <reprompt>
目的 <exchange>ユーザに入力を促すための出力を記述する.
属性 なし.

12. ユーザの入力

12.1. operation

<operation>は,<input>(12.2節参照) の集合から構成される.属性targetは,入力 の対象となるXML要素が含まれるドキュメントの場所をURIで指定する. 属性combは入力の組み合わせを指定する. 属性comb図 8に示す値を取ることができる.

図8 : <operation>の属性combの記述
属性値 入力の組み合わせ方
seq seq

<input>の記述順に入力を受け付ける. <input>で記述された入力を全て受け付ければ, <action>内の実行に移る.

par par

<input>で記述された入力を同時もしくは順不同に受け付ける. 記述された入力を全て受け付ければ,<action>内の実行に移る.

alt alt

<input>で記述された入力のうち,どれか一つの入力を受け付ければ, <action>内の実行に移る.

以下に<operation>の記述例を示す.

<operation target="burger.xml" comb="par">
   <input type="touch" event="click" match="/hamburger"/>
   <input  type="speech"  event="recognize"  target="burger.grxml"match="/grammar/rule[@id=order]" />
</operation>
         
要素 <operation>
目的 ユーザから受け付ける入力を記述する.
属性 target 入力の対象となるXML要素を含むドキュメントの場所を示すURIを記述する.
comb 要素内の<input>の入力の組み合わせを記述する. "par","alt","seq"のいずれか値をとる.デフォルトは"par".

12.2. input

<input>は,ユーザからの1入力を記述するために用いる. 属性type,属性event, および属性matchは必須属性である.

属性typeは入力モダリティを指定する. 例えば,入力モダリティとして音声を使用するなら音声("speech"),マウスを使用するな らタッチ("touch")等を指定する.属性typeの取り得る値 はフロントエンドの開発者が決定するものとし,XISLではその詳細を規定しない.

属性eventは入力イベントを指定する.例えば,音声認識 ならば"recognize"といった値を,マウス操作ならばクリック("click")やダブルクリック ("d_click")等といった値を記述する.属性typeの取り得 る値はフロントエンドの開発者が決定するものとし,XISLではその詳細を規定しない.

属性targetは入力対象となるXML要素が含まれるドキュメ ントの場所をURIで指定する.<operation>と<input>の双方において属性 targetが指定されていた場合,<input>での指定を 優先する.

属性returnには変数を","で区切って列挙する.ユーザから 入力された値,文字列,認識語彙など,フロントエンドから送信される入力データが格納さ れる.属性rerurnに記述された変数は,その場でローカル変 数として宣言されたことになる.属性returnに記述する変数 の数,およびそれぞれに代入される値はフロントエンドの開発者が決定するものとし,XISLで はその詳細を規定しない.

属性matchでは,入力対象とするXML要素名を指定する.指定方 法は原則としてXPathの書式に従うが,利便性のために,入力対象となったXML要素の属性値を変 数に代入できるようにしている.以下に要素の属性値を変数に格納する方法を示す.

<input match="XML要素名[ 変数名 := @属性名 ]"/>

記述例を以下に示す.

<input match="/goodslist/goods[goods_id:=@id]" type="touch"event="click" />
         

これにより,入力対象となった要素goodsの 属性idの値を変数goods_id に格納することができる. 属性matchで指定するXML要素はフロントエンドの開発者が決 定するものとし,XISLではその詳細を規定しない.

要素 <input>
目的 ユーザの1入力を記述する.
属性 type 入力モダリティを指定する.
event 入力イベントを指定する.
target 入力の対象となるXML要素を含むドキュメントの場所を示すURIを記述する.
match 入力対象である,XMLコンテンツ内の要素名を指定する.
return ユーザから入力された値を,格納する変数を列挙する.複数の変数は","で区切る.

12.3. 複雑な入力の組み合わせ - seq_input, par_input, alt_input

<operation>の属性combでは, 図 8に示すような<input>の入力の組み合わせを記述できる. これに加えて,XISLでは<operation>内における局所的な,逐次入力,並行入力, 択一入力を記述するための要素も用意している.

記述例を以下に示す.この例は,オンラインショッピングシステムにおいて,ある商品の ボタンを押しながら音声で購入個数を入力するか,音声のみで商品名と購入個数を入力す るかの,2通りの入力の受け付けが可能であることを示している.

<operation target="./ols.xml" comb="alt">
   <par_input>
      <input type="touch" event="click" match="/goods_list/goods[goods:=@id]/button[1]"/>
      <input  type="speech" event="recognize" target="ols.grxml"match="/grammar/rule[@id=number]" />
   </par_input>
   <input type="speech" event="recognize" target="ols.grxml"match="/grammar/rule[@id=goods_number]" />
</operation>
         
要素 <seq_input>
目的 複数の<input>を囲み,逐次的な入力の組み合わせを記述する.
属性 なし.
要素 <par_input>
目的 複数の<input>を囲み,逐次入力の組み合わせを記述する.
属性 なし.
要素 <alt_input>
目的 複数の<input>を囲み,択一的な入力の組み合わせを記述する.
属性 なし.

13. システムの動作, ユーザへの出力 - action

<action>内には,ユーザの動作およびユーザへの出力を記述する. <action>では,変数宣言(var), 演算処理(assign), 条件処理(ifswitch), 繰り返し処理(while), 対話の遷移(callreturngoto), 値の送受信(submit), セッションの終了(exit), プロンプトの再実行(reprompt), ユーザ・システムへの出力(outputseq_outputpar_output), 値の読み取り(get_elementget_valueget_attribute), 値の書き出し(set_elementset_valueset_attribute), 要素の削除(delete_element) を行なうことができる.

次章以降では<action>内部の記述について,詳細を示す.

要素 <actiont>
目的 システムの動作,ユーザへの出力を行う.
属性 なし.

14. 変数宣言 - var

<var>の詳細は8.1節を参照されたい.

15. 演算処理 - assign

<assign>は,値を変数に割り当てるために使用する. 属性nameには新しい値を格納する変数名を記述し, 属性exprには代入する新しい値を記述する. 属性name,属性exprは 共に必須属性である.属性nameで指定された変数名が, 事前に宣言されていない場合,<assign>により宣言されたとみなす.その場合の 変数のスコープはローカルである.

<assign name="price" expr="price + 1000" />   
      
<assign name="capital" expr="'Tokyo'" />
      
要素 <assign>
目的 値を変数に割り当てる.
属性 name 新しい値を格納する変数名を記述する.
event 変数の新しい値を記述する.

16. 条件処理

16.1. if, elseif, then, else

<if>は,条件処理を行なうために用いる. <if>は子要素として<then>を持たなければならない. <if>の必須属性condで示す論理式が真の場合, <then>内の処理が行なわれる.また,論理式が偽の場合は,<else>内の 処理が行なわれる.<then>,<else>で指定できる要素は<action>内 で記述できる要素と同等である.また,<if>はオプションとして子要素に <elseif>を持つことができる.なお論理式については9節を参 照されたい.

<if cond="product == 'hamburger'">
   <then>
      <assign name="price" expr="180" />
   </then>
   <elseif cond="product == 'cheeseburger'">
      <then>
         <assign name="price" expr="220" />
      </then>
      <elseif cond="product == 'orange_juce'"/>
         <then>
            <assign name="price" expr="120" />
         </then>
         <else>
            <assign name="price" expr="100" />
         </else>
      </elseif>
   </elseif>
</if>
         
要素 <if>,<elseif>
目的 条件処理を行う.
属性 cond 論理式を記述する.
要素 <then>
目的 親要素である<if>,または<elseif>の属性 condで指定された論理式が, 真の場合実行される.
属性 なし.
要素 <else>
目的 親要素である<if>,または<elseif>の属性 condで指定された論理式が, 偽の場合実行される.
属性 なし.

16.2. switch

<switch>は,多分岐判断処理を行なうために用いる.<switch>は内容として, 複数の<case>タグと,一つの<other>タグを持つことができる.また,必須 属性exprに分岐する条件となる計算式を指定する.属性 exprに記述した計算式の値が,<case>の必須属性 valueの変数の値と等しい場合, <case>内の処理 を実行する.いずれの<case>の属性valueの値とも 一致しない場合は,<other>内の処理を実行する.<case>,<other>内 で記述できる要素は,<action>内で記述できる要素と同等である.

<switch expr="product">
   <case value="'hamburger'">
      <assign name="price" expr="180" />
   </case>
   <case value="'orange_juce'">
      <assign name="price" expr="120" />
   </case>
      ・
      ・
   <other>
      <assign name="price" expr="100" />
   </other>
</switch>
         
要素 <switch>
目的 多分岐処理を行う.
属性 expr 分岐の条件となる計算式を記述する.
要素 <case>
目的 属性valueの値と,<switch>の属性exprの 値とか一致した場合に行なう処理を記述する.
属性 value <switch>の属性exprと一致させる値を記述する.
要素 <other>
目的 全ての<case>が実行されなかった場合の処理を記述する.
属性 なし.

17. 繰り返し処理 - while

<while>は,繰り返し処理を行なうために用いる. 必須属性condに論理式を記述し, 論理式が真である間,<while>内に記述した処理を繰り返す. <while>内で記述できる要素は,<action>内で記述で きる要素と同等である.次の例は1から100までの和算を行なうもの である.

<var name="number" expr ="100"/>
<var name="sum" expr ="0"/>
<while cond="number != 0">
   <assign name="sum" expr="sum + number"/>
   <assign name="number" expr="number - 1"/>
</while>
      
要素 <while>
目的 属性condに記述される論理式が真である間, <while>内の処理を行う.
属性 cond 論理式を記述する.

18. 対話の遷移

対話を遷移させるためには,<call>または<goto>を用いる. <call>,<goto>は,以下のように用いられる.

  1. 同一ドキュメント内の任意のダイアログへの遷移
  2. 他のドキュメント内の任意のダイアログへの遷移

同一ドキュメント内のダイアログに遷移する際には,必須属性nextに URIまたはURIフラグメントを指定する.他のドキュメントへ遷移する際には, 属性nextにURIを指定する.この場合,フラグメントにダイアログ名を 指定したURIを指定する.もしフラグメントが指定されなければ,そのドキュメントにおける最初の対話 が遷移先になる.

<call>と<goto>の違いは,<call>が遷移した先のダイアログから戻ってくることを想定しているのに対し, <goto>が想定していない点である,そのため,<call>は現在の対話のデータを退避させるが,<goto>は現 在の対話で利用中の一部のデータを破棄する.

以下に<call>,<return>と<goto>の詳細を示す.

18.1. call

<call>は指定したダイアログへ遷移するために使用する. 属性namelistには遷移先に渡す引数を列挙し, 属性returnには遷移先から受け取る戻り値を列 挙する.遷移先のダイアログで<return>を発見した場合,元の対話へ戻る. <return>を発見することなくドキュメントの実行が終了した場合,実行時 エラーとなる.また,<call>の属性namelist に記述された変数の個数と,遷移先の<dialog>の属性 namelistに記述された変数の個数が異なる場合は, 実行時エラーとなる.さらに属性returnに記述さ れた変数の個数と,<return>の属性namelist に記述された変数の個数が一致しない場合にも実行時エラーとなる.

以下に示す記述は,オンラインショッピングシステムにおいて,商品購入ボタンが 押された場合に,<call>により購入金額の合計と税金の額を計算するダイア ログに遷移し,合計金額と税金の額を受け取る例を示したものである.

<?xml version="1.0" encoding="Shift_JIS" standalone="no" ?>
<!DOCTYPE xisl SYSTEM "./xisl01.dtd">
<xisl ver="1.0" application="./root.xisl">
   <head>・・・</head>
   <body>
      
      <dialog id="Order_Form" comb="alt"repeat="*" namelist="goods,flag">
            ・・・
         <exchange>
            <operation  target="./order.xml" comb="alt">
               <input match="/order_form/button[1]"type="touch"event="click"/>
               <input type="speech" match="" event="./grammar.txt#order"/>
            </operation>
            <action>
               <call   next = "#Calc_Sum"  namelist ="number, tax_rate" return ="total, tax"/>
            </action>
         </exchange>  
            ・・・
      </dialog>
         
      <dialog id="Calc_Sum" repeat="1" namelist="number,tax_rate">
         <begin>
            <assign var="sub_total" expr="goods_price * number"/>
            <assign var="tax" expr="sub_total * tax_rate"/>
            <assign var="total" expr="subtotal + tax"/>
            <return namelist="total,tax"/>
         </begin>
      </dialog>
   </body>
</xisl>
         
要素 <call>
目的 他のダイアログへ遷移する.
属性 next 遷移先を示すURIを指定する.
namelist 引数を列挙する.複数の引数は","で区切る.
return 戻り値を格納する変数を列挙する.複数の変数は","で区切る.

18.2. return

<return>は,<call>で呼び出された対話から元の対話へ戻るために使用する. 戻る場所は元の対話の<call>が記述されている場所である.属性namelist には,呼び出し側の<call>の属性returnに戻す値を記述する. <return>の属性namelistに記述された変数の個数と,<call>の属性 returnに記述された変数の個数が一致しない場合は実行時エラーとなる.

<return namelist = "total, tax"/>
         
要素 <return>
目的 呼び出し元のダイアログへ戻る.
属性 namelist 呼び出し元の<call>の属性returnに戻す値を格納した変数 を列挙する.複数の変数は","で区切る.

18.3. goto

<goto>は指定したダイアログへ遷移するために使用する.ただし<goto>で遷移する場合, 元の対話に復帰することはない.属性namelistには遷移先に渡す引数 を列挙する.以下に遷移先とデータ破棄の関係を示す.

1. 同一ドキュメント内のダイアログへの遷移
たとえ同一ダイアログへの遷移であっても,現在のダイアログ内のデータ(ダイアログ変数,ローカル変数) は破棄される.セッション変数,ドキュメント変数,アプリケーション変数は保持される.
2. 同一アプリケーション内における他のドキュメントへの遷移
現在のドキュメント内のデータ(ドキュメント変数,各ダイアログのダイアログ変数, 各exchangeのローカル変数)は破棄される.セッション変数,アプリケーショ ン変数は保持される.
3. 別アプリケーションのドキュメントへの遷移
アプリケーション内のデータ(アプリケーション変数,アプリケーション内の各ドキュメント変数,各ドキュメ ント内のダイアログ変数,各exchangeのローカル変数)を全て破棄する.セッシ ョン変数のみ保持される.

<call>で呼び出された対話内で<goto>を発見した場合においても,同様に上記に示した動作をとる. この場合,<call>で呼ばれたという情報も破棄され,呼び出し側の対話へ戻る事は無くなる. もし,<goto>で遷移した先のダイアログで<return>を発見した場合,<call>で呼ばれたという 情報が破棄されているため,実行時エラーとなる.なお,<goto>の属性namelist に記述された変数の個数と,遷移先の<dialog>の属性namelistに記述された変数 の個数が異なる場合も<call>と同様に,実行時エラーとなる.

<goto   next = "Help.xisl"  namelist ="keyword"/>
         
要素 <goto>
目的 他のダイアログへ遷移する.ただし元の対話への復帰はできない.
属性 next 遷移先を示すURIを指定する.
namelist 引数を列挙する.複数の引数は","で区切る.

19. 値の送受信 - submit

<submit>は,変数の値をHTTP GETまたは POSTリクエスト経由でドキュメントサーバに送信し,戻り値を受 信する.属性nextは必須属性であり,値の送信先となるURIを記述する. 属性methodにはリクエストのメソッド"get"もしくは"post"を指定する. 属性namelistには,サーバに引き渡す変数を列挙し,サーバからの戻り値を格納 する変数を属性returnで指定する.

<submit  next="/cgi-bin/weather.cgi"  method="post"  namelist="city"return="result"/>
      
要素 <submit>
目的 変数の値をHTTP GETまたはPOSTリクエスト経由でドキュメントサーバに送信し, 戻り値を受信する.
属性 next 値の送信先を示すURIを記述する.
method リクエストのメソッドを記述:getまたはpost.
nemalist 送信する変数を列挙する.
return サーバからの戻り値を格納する変数を記述する.

20. セッションの終了 - exit

<exit>は,実行中のダイアログ,ドキュメント,アプリケーションを終了 するために使用する.

<exit/>
      
要素 <exit>
目的 実行中のダイアログ,ドキュメント,アプリケーションを終了する.
属性 なし.

21. プロンプトの再実行 - reprompt

<reprompt>の詳細は11節を参照されたい.

22. 変数の参照 - value

<value>は,<output>内に変数の値を埋め込むために使用する. 参照する変数は,必須属性exprに記述する. 属性exprに記述した変数に格納されている 値は,<value>と置き換えられてフロントエンドに送信される.

下記の例で,変数titleにXML and Javaが格納されている場合,フロントエン ドには"Please speak the author of XML and Java"という内容が送信され, それに応じた出力がフロントエンドで実行される.

<exchange>
   <prompt>
      <output type="speech" event="tts-speech">
         <![CDATA[
            <param name="speech-text">
               Please speak the author of <value expr="title"/> .
            </param>
         ]]>
      </output>
   </prompt>
   <operation>
      ・・・
   </operation>
   <aciton>
      ・・・
   </action>
</exchange>
      
要素 <value>
目的 <output>内に変数の値を埋め込む.
属性 expr 参照する変数を記述する.

23. ユーザ, システムの出力 - value

<output>は,ユーザへの1出力を記述するために使用する. 属性typeに出力モダリティを指定し, 属性eventに出力イベントを指定する. 属性type, 属性eventで指定する内容は,フロント エンドに依存した部分であり,XISLの仕様では規定しない.

<output>に記述する内容はCDATAセクションとする.出力する内容を全てCD ATAセクションとすることで,システムに依存した独自の要素を記述することがで きる.なお,<output>内のCDATAセクションには,<value>を記述する ことができる.

以下に,ブラウザにコンテンツを表示し,擬人化エージェントに音声出力をさせる 場合を想定して,記述例を示す.

<exchange>
   <operation>
      ・・・
   </operation>
   <action>
      <output type="mmi-browser" event="open">
         <![CDATA[
            <param name="window-name">Top_Page</param>
            <param name="uri">./top.xml</param>
            <param name="position">center</param>
         ]]>
      </output>
      <output type="speech" event="agent-speech">
         <![CDATA[ 
            <param name="agent-name">Wizard</param>
            <param name="speech-text">May I help you?</param>
         ]]>
      </output>
   </action>
</exchange>
      
要素 <output>
目的 ユーザへの1出力を記述する.
属性 type 出力モダリティを記述する.
event 出力イベントを記述する.

<output>は,原則として記述した順に実行される.出力を制御する場合は, <par_output>,<seq_output>を使用する.図 9 に示すように,<output>を<par_output>で囲むと同時出力となる. また<par_output>内で,局所的に逐次出力を行ないたい場合は, <output>を<seq_output>で囲む.

図9 : 逐次出力,同時出力の記述
<seq_output> seq

<seq_output>内に記述された<output>,および<action>の子要素である <output>は,記述された順に実行していく.<seq_output>内の全ての <output>が実行されるまで<seq_output>を抜けることはない.

<par_output> par

<par_output>内で記述された<output>は,記述された順序に関係なく同時に実行していく. <par_output>内の<output>が全て実行し終わるまで,<par_output>を抜けることはない.

以下に,<para_output>,<seq_output>を<action>内に記述した例を示す. また図 10に実行の概念図を示す. 以下の例では,映像と音楽と擬人化エージェント出力を同時に行なう. ただし,擬人化エージェントの動作は逐次的に実行される.

<exchange>
   <operation>
      ・・・
   </operation>
   <action>
      <par_output>
         <output type="sound" event="play">
            <![CDATA[
               <param name="file_name">BGMusic.mp3</param>
            ]]>
         </output>
         <output type="movie" event="play">
            <![CDATA[
               <param name="file_name">BGMovie.mpg</param>
            ]]>
         </output>
         <seq_output>
            <!-- Create Agent -->
            <output type="agent" event="create">
               <![CDATA[
                  <param name="agent-name">Wizard</param>
                  <param name="agent-file">Merlin.acs</param>
               ]]>
            </output>
            <output type="speech" event="agent-speech">
               <![CDATA[
                  <param name="agent-name">Wizard</param>
                  <param name="speech-text">Please wait a moment.</param>
               ]]>
            </output>
         </seq_output>
      </par_output>
   </action>
</exchange>
      
出力実行の概念図

図10 : 出力実行の概念図

要素 <seq_output>
目的 複数の<output>を囲み,逐次的な出力を行なう.
属性 なし.
要素 <par_output>
目的 複数の<output>を囲み,同時出力を行なう.
属性 なし.

24. 値の読み取り

<get_element>,<get_value>,<get_attribute>は,指定したXML ドキュメントまたは変数からXML要素,XML要素の内容,属性値を 取得するために用いられる. <get_element>,<get_value>, <get_attribute>で指定する属性はtargetvarmatchplaceであり, このうち必須属性はtargetvarmatchである.

属性targetには,対象となるXMLドキュメントを示す URIまたは,変数名を指定し,属性varには,取得した 値を格納する変数名を指定する.

属性matchには,取得したいXML要素,XML要素の内容, 属性値をXPathの書式に従って指定する.なお,指定したドキュメントおよび変数, 指定したXML要素,XML要素の内容,属性名が存在しない場合は,実行時エラーとなる.

属性placeでは,読み取りの対象となる XMLドキュメント の場所を指定する.指定できる場所は,クライアント(temp)DB内のコンテンツ,配信サ ーバ(master)内のコンテンツの何れかである.属性place を明示的に指定しない場合は,tempとみなす.

図 11および図 12に, <get_element>,<get_value>,<get_attribute>の説明の際に用い る,読み取りの対象となるXMLドキュメント,およびXML要素が格納されている変数を示す.

<?xml version="1.0" encoding="Shift_JIS"?>
<goods_list>
   <category type="food">
      <goods id ="a001">
         <name>hamburger</name>
         <price value="180">\180</price>
         <stock>200</stock>
      </goods>
      <goods id ="a002">
         <name>cheeseburger</name>
         <price value="220">\220</price>
         <stock>150</stock>
      </goods>
         ・・・
   </category>
   <category type="drink">
      <goods id ="b001">
         <name>orange_juce</name>
         <price value="120">\120</price>
         <stock>200</stock>
      </goods>
         ・・・
   </category>
      ・・・
</goods_list>
      

図11 : XMLドキュメント ― goods_list.xml

<category type="drink">
   <goods id ="b001">
      <name>orange_juce</name>
      <price value="120">\120</price>
      <stock>200</stock>
   </goods>
      ・・・
</category>
      

図12 : 変数 ― drink

24.1. XML要素の読み取り - get_element

<get_element>は,指定したXMLドキュメント,もしくは変数に格納されているXML要素から, 任意のXML要素を取得するために使用する.

図 11に示したXMLドキュメント(goods_list.xml)から XML要素/goods_list/category [@type='food']を取得するための記述例を以下に示す.

<get_element  target  ="goods_list.xml" var ="category" match  ="/goods_list/category[@type='food']" place ="master">
         

上記の<get_element>により,変数categoryには以下のXML要素が格納される.

<category type="food">
   <goods id ="a001">
      <name>hamburger</name>
      <price value="180">\180</price>
      <stock>200</stock>
   </goods>
   <goods id ="a002">
      <name>cheeseburger</name>
      <price value="220">\220</price>
      <stock>150</stock>
   </goods>
      ・・・
</category>
         

また,図 12に示した変数drinkから, XML要素/cagtegory/goods[@id='b001']を取得するための記述例を 以下に示す.

<get_element  target  ="drink" var ="goods" match  ="/category/goods[@id='b001']" place ="temp">
         

上記の<get_element>により,変数goodsには以下の要素が格納される.

<goods id = "b001">
   <name>orange_juce>/name>
   <price value="120">\120>/price>
   <stock>200>/stock>
</goods>
         
要素 <get_element>
目的 指定したXMLドキュメント,もしくは変数に格納されているXML要素から任意のXML要素を取得する.
属性 target XMLドキュメント名,またはXML要素を格納している変数名を指定する.
var 取得した内容を格納する変数名を記述する.
match 取得したいXML要素名を指定する(Xpathで指定).
temp tempまたはmasterを指定する(デフォルトはtemp).

24.2. XML要素の内容の読み取り - get_value

<get_value>は,指定したXMLドキュメント,もしくは変数に格納されているXML要素 から任意のXML要素の内容を取得するために使用する.ただし,XML要素の直接の子供となる 内容のテキストデータのみを取得する.

図 11に示したXMLドキュメント(goods_list.xml)からXML要素 /goods_list/category [@id='food']/goods[@id='a001']/nameの内容を取得するための 記述例を以下に示す.

<get_value  target  ="goods_list.xml" var ="name" 
        match="/goods_list/category[@type='food']/goods[@id='a001']/name" 
            place ="master">
         

上記の<get_value>により,変数nameには以下の内容が格納される.

hamburger
         

また,図 12に示した変数drinkから, XML要素/category/goods[@id='b001']/stockの内容を取得するための記述例を以下に示す.

<get_value  target  ="drink" var ="stock" 
           match  ="/category/goods[@id='b001']/stock" place ="temp">
         

上記の<get_value>により,変数stockには以下の内容が格納される.

200
         
要素 <get_value>
目的 指定したXMLドキュメント,もしくは変数に格納されているXML要素から任意のXML要素の内容を取得する. ただし,XML要素の直接の子供となる内容のテキストデータのみを取得する.
属性 target XMLドキュメント名,またはXML要素を格納している変数名を指定する.
var 取得した内容を格納する変数名を記述する.
match 取得したいテキストデータを子供として持つXML要素名を指定する(Xpathで指定).
temp tempまたはmasterを指定する(デフォルトはtemp).

24.3. 属性値の読み取り - get_attribute

<get_attribute>は,指定したXMLドキュメント, もしくは変数に格納されているXML要素から任意のXML要素の属性値を取得するために使用する.

図 11に示したXMLドキュメント(goods_list.xml)から 属性/goods_list/category [@id='food']/goods[@id='a001']/price/@value を取得するための記述例を以下に示す.

<get_attribute  target  ="goods_list.xml" var ="price" 
            match="/goods_list/category[@type='food']/goods[@id='a001']/price/@value"
            place ="master">
         

上記の<get_attribute>により,変数priceには以下の属性値が格納される.

180
         

また,図 12に示した変数drinkから, 属性 /cagtegory/@typeを取得するための記述例を以下に示す.

<get_attribute  target  ="drink" var ="type" match  ="/cagtegory/@type" place ="temp">
         

上記の<get_attribute>により,変数typeには以下の属性値が格納される.

food
         
要素 <get_attribute>
目的 指定したXMLドキュメント,もしくは変数に格納されているXML要素から任意のXML要素の属性値を取得する.
属性 target XMLドキュメント名,またはXML要素を格納している変数名を指定する.
var 取得した属性値を格納する変数名を記述する.
match 取得したい属性値を持つ属性名を指定する(Xpathで指定).
temp tempまたはmasterを指定する(デフォルトはtemp).

25. 値の書き出し

<set_element>,<set_value>,<set_attribute>は, 指定したXMLドキュメント,もしくは変数に格納されているXML要素, XML要素の内容,属性値を更新するために用いられる. <set_element>,<set_value>,<set_attribute>で指定する共通の属性は targetvarmatchplaceであり, <set_element>のみ属性typeを指定する. 必須属性はtargetvarmatch,および<set_element>の属性 typeである.

属性targetには,対象となるXMLドキュメント名または,変数名を指定する. 属性varには,更新する値または変数を記述する.

属性matchには,更新の対象となるXML要素,XML要素の内容,属性値のパス をXPathの書式に従って指定する.なお,指定したドキュメントおよび変数,指定したXML要素,XML要素の内容, 属性名が存在しない場合は,実行時エラーとなる.

属性placeでは,更新される対象を有しているXMLドキュメントの場所を指定 する.指定できる場所は,クライアント(temp)DB内のコンテンツ,配信サーバ(master)内のコンテンツの何 れかである.属性placeを明示的に指定しない場合は,tempとみなす.

なお,指定したドキュメントおよび変数,指定したXML要素,XML要素の内容,属性名が存在しない場合は,実行 時エラーとなる.

25.1. XML要素の書き出し - set_element

<set_element>は,指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれる任意 のXML要素を更新するために使用する.

図 11に示したXMLドキュメント(goods_list.xml)のXML要素 /goods_list/category [@type='food']/goods[@id='a001']を更新するための記述例を以下に示す.

<set_element  target  ="goods_list.xml" var ="goods" 
           match  ="/goods_list/category[@type='food']/goods[@id='a001']" 
           type="overset" place ="master">
         

上書きする値が格納されている変数goodsは図 13に示す通りである.

<goods id = "a001">
   <name>hamburger</name>
   <price value="200">\200</price>
   <stock>150</stock>
</goods>
         

図13 : 変数 ― goods

上記の<set_element>により,図 11に示したgoods_list.xml は以下のように書き換えられる.

<?xml version="1.0" encoding="Shift_JIS"?>
<goods_list>
   <category type="food">
      
      <goods id ="a001">
         <name> hamburger </name>
         <price value="200">\200</price>
         <stock>150</stock>
      </goods>
      
      <goods id ="a002">
         <name> cheeseburger </name>
         <price value="220">\220</price>
         <stock>150</stock>
      </goods>
         ・・・
   </category>
      ・・・
</goods_list>
         

また,図 12に示した変数drinkのXML要素/cagtegory に子要素を挿入するための記述例を以下に示す.

<get_element  target  = "drink" var = "cola" 
      match = "/category" type = "insert" place = "temp">
         

挿入する値が格納されている変数colaは図 14に示す通りである.

<goods id ="b008">
   <name>cola</name>
   <price value="130">\130</price>
   <stock>250</stock>
</goods>
         

図14 : 変数 ― cola

上記の<set_element>により, 図 12に示した 変数drinkは以下のように書き換えられる.

<category type="drink">
   <goods id ="b001">
      <name>orange_juce</name>
      <price value="120">\120</price>
      <stock>200</stock>
   </goods>
      ・・・
   <goods id ="b008">
      <name>cola</name>
      <price value="130">\130</price>
      <stock>250</stock>
   </goods>
</category>
         
要素 <set_element>
目的 指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれる任意のXML要素を更新する.
属性 target XMLドキュメント名,またはXML要素を格納している変数名を指定する.
type 上書き(overset)または挿入(insert)を指定する.
match 更新の対象となる要素名を指定する(Xpathで指定).
place tempまたはmasterを指定する(デフォルトはtemp).

25.2. XML要素の値の書き出し - set_value

<set_value>は,指定したXMLドキュメント,もしくは 変数に格納されているXML要素に含まれる任意のXML要素の内容 を更新するために使用する.

図 11に示したXMLドキュメント(goods_list.xml)の XML要素/goods_list/category [@type='food']/goods[@id='a001']/stockの 内容を更新するための記述例を以下に示す.

<set_value  target  ="goods_list.xml" var ="198" 
         match="/goods_list/category[@type='food']/goods[@id='a001']/stock"
         place ="master">
         

上記の<set_value>により,図 11に示した goods_list.xmlは以下のように書き換えられる.

<?xml version="1.0" encoding="Shift_JIS"?>
<goods_list>
   <category type="food">
      <goods id ="a001">
         <name>hamburger</name>
         <price value="180">\180</price>
         <stock>198</stock>
      </goods>
      <goods id ="a002">
         <name>cheeseburger</name>
         <price value="220">\220</price>
         <stock>150</stock>
      </goods>
      ・・・
   </category>
   ・・・
</goods_list>
         

また,図 12に示した変数drinkのXML要素 /cagtegory/goods[@id='b001']/priceの内容を更新するための記 述例を以下に示す.

<set_value  target  ="drink" var ="\130" 
      match="/cagtegory/goods[@id='b001']/price" place ="temp">
         

上記の<set_value>により,図 12に 示した変数drinkは以下のように書き換えられる.

<category type="drink">
   <goods id ="b001">
      <name>orange_juce</name>
      <price value="120">\130</price>
      <stock>200</stock>
   </goods>
   ・・・
</category>
         
要素 <set_value>
目的 指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれる任意のXML要素の内容を更新する.
属性 target XMLドキュメント名,またはXML要素を格納している変数名を指定する.
var 上書きする値または変数名を記述する.
match 更新の対象となるXML要素名を指定する(Xpathで指定).
place tempまたはmasterを指定する(デフォルトはtemp).

25.3. 属性値の書き出し - set_attribute

<set_attribute>は,指定したXMLドキュメント,もしくは変数に格納されている XML要素に含まれる任意のXML要素の属性値を更新するために使用する.

図 11に示したXMLドキュメント(goods_list.xml)の属性値 /goods_list/category [@type='food']/goods[@id='a001']/@idを更新するための 記述例を以下に示す.

<set_attribute  target  ="goods_list.xml" var ="a0001" 
         match ="/goods_list/category[@type='food']/goods[@id='a001']/@id" 
         place ="master">
         

上記の<set_attribute>により,図 11に示した goods_list.xmlは以下のように書き換えられる.

<?xml version="1.0" encoding="Shift_JIS"?>
<goods_list>
   <category type="food">
      <goods id ="a0001">
         <name>hamburger</name>
         <price value="180">\180</price>
         <stock>200</stock>
      </goods>
      <goods id ="a002">
         <name>cheeseburger</name>
         <price value="220">\220</price>
         <stock>150</stock>
      </goods>
      ・・・
   </category>
   ・・・
</goods_list>
         
要素 <set_attribute>
目的 指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれる任意のXML要素の属性値を更新する.
属性 target XMLドキュメント名,またはXML要素を格納している変数名を指定する.
var 上書きする値または変数名を記述する.
match 更新の対象となるXML要素名を指定する(Xpathで指定).
place tempまたはmasterを指定する(デフォルトはtemp).

26. 要素の削除

<delete_element>は,指定したXMLドキュメント,もしくは変数に格納されているXML要素に 含まれる任意のXML要素を削除するために使用する.

図 11に示したXMLドキュメント(goods_list.xml)の XML要素/goods_list/category [@type='food']/goods[@id='a001']/を 削除するための記述例を以下に示す.

<?xml version="1.0" encoding="Shift_JIS"?>
<goods_list>
   <category type="food">
      <goods id ="a002">
         <name>cheeseburger</name>
         <price value="220">\220</price>
         <stock>150</stock>
      </goods>
      ・・・
   </category>
   ・・・
</goods_list>
      

また,図 12に示した変数drinkのXML要素/cagtegory/goods[@id='b001']/stock を削除するための記述例を以下に示す.

<delete_element target = "drink" 
         match = "/cagtegory/goods[@id='b001']/stock" 
         place ="temp">
      

上記の<delete_element>により,図 12に示した変数drinkは以下のように 書き換えられる.

<category type="drink">
   <goods id ="b001">
      <name>orange_juce</name>
      <price value="120">\120</price>
   </goods>
   ・・・
</category>
      
要素 <delete_element>
目的 指定したXMLドキュメント,もしくは変数に格納されているXML要素に含まれる任意のXML要素を削除する.
属性 target XMLドキュメント名,またはXML要素を格納した変数名を指定する.
match 削除したいXML要素名を指定する(Xpathで指定).
place tempまたはmasterを指定する(デフォルトはtemp).

付録1) XISLのDTD

<!--
   XISL 1.0 DTD
   version 2002-01-21
-->

<!ENTITY  % exchange.type " par_exchange | seq_exchange | alt_exchange | exchange ">

<!ENTITY  % input.type " input | par_input | seq_input | alt_input ">

<!ENTITY  % output.type " output | seq_output | par_output ">

<!ENTITY  % begin.end.content " var | assign | if | switch | while | 
                             call | return | goto | submit | 
                             exit | 
                             seq_output | par_output | output | 
                             get_value | get_element | get_attribute | 
                             set_value | set_element | set_attribute | 
                             delete_element ">

<!ENTITY  % action.content " %begin.end.content; | reprompt ">

<!ENTITY % boolean   "( true | false )" >

<!ENTITY % duration "CDATA" >

<!ENTITY % conditional.logic "CDATA">

<!ENTITY % expression "CDATA" >

<!ENTITY % variable.name "CDATA" >

<!ENTITY % variable.names "CDATA" >

<!ENTITY % integer "CDATA" >

<!ENTITY % target.name "CDATA" >

<!ENTITY % uri "CDATA" >

<!ENTITY % path "CDATA" >

<!ENTITY  % get.set.attrs    " target  %target.name;     #REQUIRED
                               var     %variable.name;   #REQUIRED
                               match   %path;            #REQUIRED
                               place   (temp | master)   'temp' ">

<!--========================== Root ==========================-->

<!ELEMENT xisl (head?,body) >
<!ATTLIST xisl  version          CDATA  #REQUIRED
                application      %uri;  #IMPLIED>

<!ELEMENT head    (name?,author?,date?,details?,history?)>

<!ELEMENT name    (#PCDATA)>

<!ELEMENT author  (#PCDATA)>

<!ELEMENT date    (#PCDATA)>

<!ELEMENT history (item+)>

<!ELEMENT item    (date,details)>

<!ELEMENT details (#PCDATA)>

<!ELEMENT body    (document_var?,dialog*)>

<!ELEMENT document_var (var+)>

<!--========================== Dialog ==========================-->

<!ELEMENT dialog  ( dialog_var?, begin?, (%exchange.type;)* , end?) >

<!ELEMENT dialog_var (var+) >
<!ATTLIST dialog   id       ID     #REQUIRED
                   comb     (par | seq | alt)    "seq"
                   repeat   CDATA                "1"
                   scope    (dialog | document)  "dialog"
                   arg      %variable.names;     #IMPLIED>

<!--========================== Begin ==========================-->

<!ELEMENT begin    (%begin.end.content;)*>

<!--========================== End ==========================-->

<!ELEMENT  end     (%begin.end.content;)*>

<!--========================== Exchanges ==========================-->

<!ELEMENT par_exchange  (%exchange.type;)+>

<!ELEMENT seq_exchange  (%exchange.type;)+>

<!ELEMENT alt_exchange  (%exchange.type;)+>

<!ELEMENT exchange      (prompt?,operation,action)>

<!--========================== Prompt ==========================-->

<!ELEMENT prompt  (%output.type;)+  >
<!ATTLIST prompt   count       %integer;   "1"
                   timeout     %duration;  #IMPLIED 
                   bargein     %boolean;   "true" >

<!--========================== Operation ==========================-->

<!ELEMENT operation   (%input.type;)+ >
<!ATTLIST operation   target %target.name;      #IMPLIED
                      comb ( par | seq | alt )  "par">

<!ELEMENT par_input (%input.type;)+>

<!ELEMENT seq_input (%input.type;)+>

<!ELEMENT alt_input (%input.type;)+>

<!ELEMENT input EMPTY >
<!ATTLIST input  match     %path;   #REQUIRED
                 type      CDATA   #REQUIRED
                 event     CDATA   #REQUIRED
                 target    %target.name;     #IMPLIED
                 return    %variable.names;  #IMPLIED >

<!--========================== Action ==========================-->

<!ELEMENT action   (%action.content;)*>

<!ELEMENT var EMPTY>
<!ATTLIST var   name  %variable.name;    #REQUIRED
                expr  %expression;       #IMPLIED>

<!ELEMENT assign EMPTY>
<!ATTLIST assign  name  %variable.name;  #REQUIRED
                  expr  %expression;     #REQUIRED>

<!ELEMENT if (then, (else? | elseif*))>
<!ATTLIST if cond  %conditional.logic; #REQUIRED>

<!ELEMENT then  (%action.content;)*>

<!ELEMENT else  (%action.content;)*>

<!ELEMENT elseif  ( then, (else?|elseif*) )>
<!ATTLIST elseif  cond %conditional.logic;  #REQUIRED>

<!ELEMENT switch  ( case+, other? )>
<!ATTLIST switch  expr  %expression;  #REQUIRED>

<!ELEMENT case  (%action.content;)*>
<!ATTLIST case  value CDATA #REQUIRED>

<!ELEMENT other (%action.content;)*>

<!ELEMENT while (%action.content;)*>
<!ATTLIST while cond %conditional.logic; #REQUIRED>

<!ELEMENT call EMPTY>
<!ATTLIST call  next        %uri;  #REQUIRED
                namelist    %variable.names;  #IMPLIED
                return      %variable.names;  #IMPLIED>

<!ELEMENT return  EMPTY>
<!ATTLIST return  namelist  CDATA  #IMPLIED> 

<!ELEMENT goto EMPTY>
<!ATTLIST goto  next      %uri;             #REQUIRED
                namelist  %variable.names;  #IMPLIED>

<!ELEMENT submit EMPTY>
<!ATTLIST submit next     %uri;  #REQUIRED 
                 method   (get | post) "get"
                 namelist %variable.names;   #IMPLIED
                 return   %variable.names;   #IMPLIED >

<!ELEMENT exit EMPTY>

<!ELEMENT reprompt EMPTY>

<!ELEMENT seq_output (%output.type;)*>

<!ELEMENT par_output (%output.type;)*>

<!-- The <value> elements appear in the CDATA section of <output> elements.
     <!ELEMENT value  EMPTY>
     <!ATTLIST value  expr  %expression;  #REQUIRED>
 -->
 
<!ELEMENT output  (#PCDATA) >
<!ATTLIST output  type     CDATA  #REQUIRED
                  event    CDATA  #REQUIRED>
                  
<!ELEMENT get_value EMPTY>
<!ATTLIST get_value  %get.set.attrs;>

<!ELEMENT get_element EMPTY>
<!ATTLIST get_element %get.set.attrs;>

<!ELEMENT get_attribute  EMPTY>
<!ATTLIST get_attribute  %get.set.attrs;>

<!ELEMENT set_value  EMPTY>
<!ATTLIST set_value  %get.set.attrs;>

<!ELEMENT set_element  EMPTY>
<!ATTLIST set_element  %get.set.attrs; 
                       type (insert | overset) #REQUIRED>

<!ELEMENT set_attribute   EMPTY>
<!ATTLIST set_attribute   %get.set.attrs;>
  
<!ELEMENT delete_element EMPTY>
<!ATTLIST delete_element target   %target.name;    #REQUIRED
                         match    %path;           #REQUIRED
                         place    (temp | master)  "temp">