9.5 アクション

この項では、アクションモデル内で利用可能なアクションについて説明します。アクションは、入力をパラメータの形で特定のタスクを実行する点で、プログラミングステートメントに似ています。アクションモデルは、XMLドキュメントの処理とXMLデータソースとの通信を行うための命令セットです。アクションモデルは、統合アクティビティ内のすべてのデータマッピング、データ変換、およびデータ転送を実行します。アクションモデル内のすべてのアクションは連動します。

ランタイム時に、すべてのアクションはECMAScriptの実行可能フォームに変換されて処理されます。設計時に、多くのアクションはECMAScript式をパラメータとして受け入れるので、アクションモデルの柔軟性と制御が大いに増します。[関数]アクションを使用すると、ECMAScript言語の機能をすべて利用できるようになるため、優れた柔軟性と制御が得られます。

この項では、次のトピックについて説明します。

9.5.1 詳細

この項では、次のアクションについて説明します。

ネームスペースの適用

この項では、次のトピックについて説明します。

[ネームスペースの適用]アクションについて

統合アクティビティが常に有効なXMLドキュメントを受信するのが理想的です(つまり、ドキュメントはデータをスキーマに照らして検証し、マップし、適切に変換して、有効なXMLドキュメントを送信します)。しかし、必ずしもそうなるとは限りません。ネームスペースをすべて無視したいという場合もあります。何らかの方法でXMLドキュメントを検証できることが重要です。このようなさまざまなXML処理の事例では、統合アクティビティに備わっているプレフィックスとネームスペースの処理を変更または上書きする方法が必要です。

[ネームスペースの適用]アクションには、アクションモデル内で入出力メッセージのためのネームスペースとネームスペースプレフィックスを有効に管理するメカニズムが用意されています。このアクションを使用することにより、Webサービスのネームスペース宣言とプレフィックス宣言を1ヶ所に集約したり、入出力メッセージに宣言されたものを上書きしたり、ネームスペースをすべて無視したりできます。

[ネームスペースの適用]アクションは入出力メッセージに適用できます。1つのメッセージパートに複数の[ネームスペースの適用]アクションを用意して、アクションモデルに指定されている条件に基づいてネームスペースを効果的に変更することもできます。宣言されたネームスペースは、アクションモデルの終わりに達するか、または別の[ネームスペースの適用]アクションが実行されるまで有効です。つまり、最新の[ネームスペースの適用]アクションだけが有効です。

新しい統合アクティビティを作成すると、WSDLがネームスペースを宣言している場合には、[ネームスペースの適用]アクションが出力メッセージ用に自動的に作成されます。コンポーネントを作成した後は、追加の[ネームスペースの適用]アクションを手動で作成できます。

[ネームスペースの適用]アクションの作成
  1. アクションモデル内で[ネームスペースの適用]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[詳細]>[ネームスペースの適用]の順に選択します。

  3. ネームスペースを適用するメッセージ(入力、出力、_SystemFault、プロジェクト)を[次のネームスペースを適用するパート]リストから選択します。

  4. プラス(+)アイコンをクリックして新しい行を追加してから、[ネームスペース]列をクリックしてネームスペースURIを入力します。

    表には選択したメッセージパートのすべてのネームスペース宣言が表示されます。新しい[ネームスペースの適用]アクションを作成すると、表に選択したパートの宣言のリストが含まれている場合とそうでない場合があります。宣言のリストは、最初はWSDLに定義されている宣言から作成されます。

    メッセージパートの宣言リスト内で、プレフィックスは固有でなければなりません。しかし、URIのプレフィックスが固有であれば、重複するネームスペースURIがあってもかまいません。それで、同一のネームスペースURIに関連付けられた複数のプレフィックスを宣言できます。

  5. 必要に応じて、[ドキュメントをXPath式で使用する場合は、ネームスペースを無視する]をクリックします。

    [マップ]アクションのソースXPathが要素をXMLローカル名のみで検索するようにするには、このオプションを使用します。

    これは[マップ]アクションを指定するより制限の少ない方法(「セクション 9.5.8, マップ」を参照)を提供し、[マップ]アクションのソース指定に誤ったプレフィックスが含まれているか、またはプレフィックスが含まれていない場合に役立ちます。これにより、入力メッセージにプレフィックスが含まれているかどうかをテストする[決定]アクション(「セクション 9.5.5, 決定」を参照)の内部に[ネームスペースの適用]アクションを配置することができますが、さらに[マップ]アクションを1セット配置して入力を別のパートにマップすることができます。言い換えると、統合アクティビティは通常プレフィックスを含む入力を予期するので、すべての[マップ]アクションをプレフィックス名で設計します。プレフィックスを含まない入力があった場合に、[決定]アクションは定義された[ネームスペースの適用]アクションをアクティブにして入力のネームスペースを無視し、どちらの場合でも[マップ]アクションが動作するようにします。

  6. 自分のアクションモデルによってビルドされた出力メッセージのルート要素にネームスペースのセットを宣言する場合は、[これらのネームスペースをパートに宣言する]をクリックします。

    出力の場合は、マップアクションの結果として出力内に作成されるプレフィックス付きの要素が確実に適切なネームスペースに解決されるように、通常はこのオプションを選択します。

    これにより、出力の受信者はドキュメントを適切に検証することができます。このオプションを選択した[ネームスペースの適用]アクションを使用して、すでに宣言を含む既存のドキュメントに新しい宣言を追加することもできます。

    [ターゲットドキュメントルート要素名]は、ネームスペース宣言属性を含むルート要素名を指定するために使用します。統合アクティビティは、WSDLドキュメントの情報と[次のネームスペースを適用するパート]で指定したメッセージパートに基づいて、自動的にこの値を入力します。

  7. [OK]をクリックします。新しいアクションがアクションモデルに追加されます。

フォルトのスロー

この項では、次のトピックについて説明します。

[フォルトのスロー]アクションについて

[フォルトのスロー]アクションを使用して、次のことを行います。

  • アクション失敗時にXMLメッセージに情報を書き込む

  • フォルトをスローする前に複数のアクションを実行する

  • コンポーネントの実行を休止する

[フォルトのスロー]は、指定した条件が真である場合にのみ実行されます。[フォルトのスロー]アクションが実行されたときに書き込まれるメッセージパートはフォルトドキュメントと呼ばれ、このメッセージ内のXMLはERRORというグローバルオブジェクトに含まれます。

[フォルトのスロー]アクションは、次のようにいくつかの方法で使用できます。

  • [フォルトのスロー]アクションをそれ自体で使用する。[フォルトのスロー]アクションダイアログ内にフォルト条件とエラーメッセージを指定できます。アクションを実行すると、フォルト条件が評価されます。条件がTrueとして評価されると、次のようになります。

    • 指定した[スロー前]アクションがあれば実行されます。実行を休止する前にアプリケーションを特定の状態のままにしておくのにとても役立ちます。たとえば、実行が完了しなかったことを伝えるメールメッセージを送信することができます。

    • エラーメッセージの内容は、指定したノードのフォルトドキュメントとグローバルオブジェクトERRORに書き込まれます。

    • アクションモデルの実行が休止します。

  • [決定]アクションの決定式内に[フォルトのスロー]アクションを使用する。[決定]アクションの決定式に、フォルト条件を入力して指定できます。次に、[決定]アクションの[True]ブランチに[フォルトのスロー]ステートメントを配置します。ここで、[フォルトのスロー]フォルト条件に追加条件を指定するか、またはフォルト条件を空白のままにしてフォルト情報を書き込むフォルトドキュメントを指定します。アクションが実行されて、すべての条件がTrueであると、[フォルトのスロー]アクションが実行されます。[決定]アクションまたは[フォルトのスロー]アクションのフォルト条件がFalseである場合は、アクションモデル内の次のアクションが実行されます。

  • [試行/フォルト時]アクション内部で[フォルトのスロー]を使用する(「試行/フォルト時」を参照)上記の方法のいずれかを[試行/フォルト時]アクションの実行ブランチ内に配置することにより、統合アクティビティの実行が休止するのを防ぎ、フォルトに対処したりフォルトから回復したりできるようになります。出力をテストしたい他のアクションが正しく動作した後に、上の2つの方法のいずれかを使用して、[試行/フォルト時]アクションの実行ブランチ内部でフォルト条件を作成します。固有のフォルトをいくつでも指定でき、それにより発生したフォルトに応じて統合アクティビティをいくつかの異なる方向に分岐させることができます。特定のフォルトに対して[フォルトのスロー]アクションがトリガされると、コンポーネントの実行を休止する代わりに、制御が[試行/フォルト時]アクションの適切なブランチに渡されます。ここで、エラーを修復するまたはエラーに応答する他のアクションを指定できます。

[フォルトのスロー]アクションの追加
  1. アクションモデル内で[フォルトのスロー]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[詳細]>[フォルトのスロー]の順に選択します。

  3. [フォルト条件]フィールドに、Trueであればアクションがフォルトをスローするような有効なECMAScript式を入力します。

    ECMA式ビルダボタンをクリックして、式を作成することもできます(「セクション 10.0, ECMA式の使用」を参照)。

  4. [{システム}{フォルト}のスロー]を選択して、エラーメッセージを_SystemFaultドキュメントに書き込みます。

    デフォルトでは、[エラーメッセージ]フィールドに入力するメッセージがドキュメントのFault/FaultInfo/Messageノードに配置されます。必要に応じて異なるノードを指定します。ECMA式ビルダボタンをクリックして、式を作成することもできます。

  5. [定義済みフォルトのスロー]を選択して、統合アクティビティに関連付けられているメッセージパートの1つであるフォルトドキュメントを選択します。

  6. [OK]をクリックします。

    新しいアクションがアクションモデルに追加されます。アプリケーションが停止する前に実行させるすべてのアクションを[スローアクションの前]ブランチに配置します。

試行/フォルト時

この項では、次のトピックについて説明します。

[試行/フォルト時]アクションについて

[試行/フォルト時]アクションは、[試行/フォルト時]アクションの[実行]ブランチ内でフォルトが発生したときに一連のアクションを実行します。定義済みのフォルトを[実行]ブランチ内にいくつでも指定できます。[試行/フォルト時]アクションを使用して、予期されるエラーを捕捉し、修復やフォルトの報告を実行する他のアクションを実行します。たとえば、[試行/フォルト時]を使用してファイルの検出に失敗する[XML交換]アクションに応答することができます。

[試行/フォルト時]アクションを追加すると、いくつかの行がアクションモデルに追加されます。

  • [試行]アクションの始まり

  • [実行]ブランチ

  • 指定したフォルトごとにブランチ

  • [その他すべてのフォルト]ブランチ

アクションがフォルトを生成する可能性があることに気付いたら、それらのアクションを[実行]ブランチに配置します。次いで、固有の状況を処理する各[フォルト時]ブランチの下にエラー処理アクションを配置します。フォルトが発生すると、[フォルト時]ブランチのアクションが実行されます。

前述の例で、[XML交換]アクションでフォルトが予期される場合には、[実行]ブランチの下にアクションを配置します。ある[フォルト時]ブランチには、別の場所からのファイル読み取りを試行する別の[XML交換]アクションを追加し、別の[フォルト時]ブランチには、拡張子の異なるファイルを検索する別の[XML交換]アクションを追加することができます。

[試行/フォルト時]アクションの追加
  1. アクションモデル内で[試行/フォルト時]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[詳細]>[試行/フォルト時]の順に選択します。

    プラス(+)アイコンを使用して、[フォルトパート名]リストに新しいフォルトパートを追加します。リストからフォルトパートを削除するには、赤い-アイコンを使用します。フォルトの順番を変更するには、上矢印と下矢印のアイコンを使用します。

    フォルトパートを指定しない場合は、[試行/フォルト時]アクションのデフォルトの[その他すべてのフォルト]ブランチに訂正のアクションを配置できます。

  3. [OK]をクリックします。

    アクションモデルビューアには、[試行/フォルト時]アクションアイコンと、1つの[実行]ブランチ、1つ以上の[フォルト時]ブランチ、および1つの[その他すべてのフォルト]ブランチが表示されます。

  4. エラーになりそうなすべてのアクションを[実行]ブランチに追加します。

  5. [フォルト時]ブランチに、[実行]ブランチで指定したエラーを解決するアクションを追加します。

    次の図は、アクションモデル内の完成した[試行/フォルト時]アクションを示しています。

9.5.2 データ交換

この項では、次のアクションについて説明します。

WS交換

この項では、次のトピックについて説明します。

[WS交換]アクションについて

[WS(Webサービス)交換]アクションは統合アクティビティで最も重要なアクションであり、WSDLファイルに指定された呼び出し規則に従って、統合アクティビティがWebサービスを呼び出せるようにします。統合アクティビティはアクションモデル作成時に[WS交換]アクションを自動的に作成します。

ほとんどの場合、アクションモデルに別の[WS交換]アクションを追加する必要はありません。しかし、そうする必要のある状況もあります。次の手順では、[WS交換]アクションを追加する方法を説明します。

[WS交換]アクションの追加
  1. アクションモデル内で[WS交換]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[データ交換]>[WS交換]の順に選択します。

    [WSDLリソース][サービス名][ポート]、および[操作]の各フィールドは、統合アクティビティ用に指定されたWSDLの情報に基づいて自動的に入力されます。

  3. 必要に応じて、使用するWebサービスの[エンドポイントの場所]フィールド(通常はサーブレットを示すURL)の情報(引用符で囲む)を変更します。または、ランタイムに[エンドポイントの場所]に評価されるECMAScript式を入力します。

  4. [メッセージ]タブをクリックします。

    [メッセージ][パート][種類/要素]の各フィールドは、統合アクティビティ用に指定されたWSDLの情報に基づいて自動的に入力されます。

  5. 必要に応じて、メッセージの[式]列をクリックし、ECMA式ビルダを使用して、メッセージのソースとターゲットを記述するECMAScript式を作成します。通常、これは入力パートまたは出力パートにXPathの場所を指定する式です。

  6. [接続]タブをクリックします。

    このタブを使用して、認証が必要なHTTPサーバの接続パラメータを指定します。

  7. 接続に使用するユーザIDを[ユーザID]フィールドに、ユーザのパスワードを[パスワード]フィールドに入力します。

    実際には、接続確立中にユーザIDとパスワードは送信されません。ここでは定義するだけです。パスワードは暗号化されます。ECMAScriptのUserIDおよびPassword変数にアクセスし、ユーザIDとパスワードを画面の値としてマップできるようになります。このようにして、パスワードはだれからも見えなくなります。

  8. 接続にクライアント証明書が必要である場合、[クライアント証明書]フィールドの参照ボタンをクリックし、この接続に使用する証明書ファイルを選択して、クライアント証明書を選択します。

  9. 接続にクライアント秘密鍵が必要な場合は、[クライアント秘密鍵]フィールドの参照ボタンをクリックし、クライント秘密鍵ファイルを選択して、クライアント秘密鍵を選択します。

  10. クライアント秘密鍵のパスワードを[秘密鍵パスワード]フィールドに入力します。

  11. 接続タイムアウト値を[接続タイムアウト]フィールドに秒数で指定します。

  12. リアルタイムで[WS交換]アクションをテストするには[適用]をクリックし、閉じるには[OK]をクリックします。

XML交換

この項では、次のトピックについて説明します。

[XML交換]アクションについて

[XML交換]アクションは、外部XMLドキュメントをDOMに読み込み、DOMのデータをXMLファイルとして書き出します。[XML交換]アクションには次の4種類があります。

  • GET

  • PUT

  • POST

  • POST with Response

GET交換を使用する場合は、統合アクティビティに取り込むXMLドキュメントを示すURLを[交換URL式]フィールドに入力します。[応答パート]フィールドでは、XMLを受信するDOM(入力、出力、_SystemFault、またはプロジェクト)を選択します。

PUT交換を使用する場合は、XMLドキュメントを書き込む場所を示すURLを[交換URL式]に入力します。[要求パート]フィールドでは、XMLとしてデータを送信する元のDOMの名前を選択します。

POST交換を使用する場合は、XMLドキュメントを書き込む場所を示すURLを[交換URL式]に入力します。[要求パート]では、XMLとしてデータを送信する元のDOMの名前を選択します。

POST with Response交換を使用する場合は、Postの場合と同じパラメータと、追加パラメータを1つ指定します。つまり、Post with Response交換から応答XMLドキュメントを受信するために、[応答パート]のDOMも指定する必要があります。Post交換との違いは、Post with Responseが起点サーバから応答XMLオブジェクトを予期するところにあります。

[XML交換]アクションの追加
  1. アクションモデル内で[XML交換]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[データ交換]>[XML交換]の順に選択します。

  3. [交換タイプ](Get、Put、Post、またはPost with Response)を選択します。

  4. [交換URL式]フィールドに、次のサポートされているプロトコルのいずれかを使用して、XMLドキュメントの完全修飾URLを定義する式を入力します。

    • file

    • FTP

    • HTTP

    • HTTPS

    選択した[交換タイプ]に応じて、このURLがXML交換アクションに使用するXMLファイルのソースまたは宛先になります。例:

    file:///g:/xmldata/invoicebatch1.xml 
    ftp://accounting:password@123.456.789.987:21/invoices/inv1.xml 
    

    これはECMAScript式なので、URL文字列は引用符で囲む必要があります。

  5. HTTPヘッダパラメータを指定する必要がある場合は、[HTTPヘッダパラメータ]をクリックします。

  6. プラス(+)アイコンをクリックして新しいヘッダパラメータを追加してから、パラメータ名とそれに対応するを入力します。共通のHTTPヘッダパラメータは「Content-Type」、「Content-Length」、および「Keep-Alive」です。パラメータと値のペアはいくつでも追加できます。

  7. [OK]をクリックして、[XML交換]ダイアログボックスに戻ります。

  8. [要求パート]フィールドで([交換タイプ]がPut、Post、またはPost with Responseの場合に有効になる)、XMLとしてデータを送信する送信元DOMの名前を選択します。

  9. [応答パート]フィールドで([交換タイプ]がPut、Post、またはPost with Responseの場合に有効になる)、XMLを受信するDOMツリーの名前を選択します。

  10. 着信するXMLドキュメントをフィルタしてパフォーマンスを改善する場合は、[ドキュメントのフィルタ]ボタンの隣にあるチェックボックスを選択してから、[ドキュメントのフィルタ]ボタンを選択します。

    表示されるドキュメントは、[XML交換]ダイアログボックスの[応答パート]で選択したドキュメントです。

    このダイアログを使用して、着信するXMLドキュメントからリアルタイムに保持するノード(破棄するノードではない)を個別に指定して、パフォーマンスを改善しRAMオーバーヘッドを減らします。

  11. ドキュメント内に保持するノードを選択します。

    選択されなかったノードはDOMを解析する前に破棄されます。

  12. 保持するノードを選択したら、[OK]をクリックして[XML交換]ダイアログボックスに戻ります。

  13. [OK]をクリックします。

    または、[適用]をクリックして、ダイアログボックスを閉じずに[XML交換]アクションの影響を確認することができます。この方法で、[XML交換]アクションを繰り返し編集して、すぐに結果を確認することができます。

9.5.3 繰り返し

この項では、次のアクションについて説明します。

中断

この項では、次のトピックについて説明します。

[中断]アクションについて

[中断]アクションは、[要素の繰り返し]、[グループの繰り返し]、または[次の間の繰り返し]ループの実行を停止します。アクションモデルは実行を継続し、ループの外にある次のアクションに進みます。

[中断]の使用が適しているのは、ループを使用して特定の1つの項目のノードリストを検索している場合などです。ターゲット項目が検出された場合は、繰り返しを継続する必要はありません。[中断]を使用して、ループを直ちに終了することができます。

メモ:[中断]アクションは、通常(ループ内の)[決定]アクションの1つのブランチで使用されます。[決定]アクションの[True]または[False]ブランチのいずれかに[中断]アクションを配置します。

[中断]アクションの追加
  1. [中断]アクションを組み込むための変更を行う繰り返しアクション内で、[中断]アクションを配置するループ内部の位置を選択します。

    一般に、これは[決定]アクションのどちらか一方の枝です。

  2. [新規アクション]>[繰り返し]>[中断]の順に選択します。

    [中断]アクションはアクションモデルに挿入されます。

続行

この項では、次のトピックについて説明します。

[続行]アクションについて

[続行]アクションは、現在実行している[要素の繰り返し]、[グループの繰り返し]、または[次の間の繰り返し]ループなどの繰り返し部分を停止し、次の繰り返し部分をループの最初から実行します。[続行]アクションによって、ループ内の下流アクションをスキップしつつ、ループを続行して次の繰り返し部分に進むことができます。

[続行]アクションは、リスト内のある項目を何らかの理由でスキップしなければならないが、ループの実行は続行する必要がある場合に適しています。

メモ:[続行]アクションは、通常、ループ内の[決定]アクションの1つのブランチで使用します。[決定]アクションの[True]または[False]ブランチのいずれか適切なほうのブランチに、[続行]アクションを配置します。

[続行]アクションの追加
  1. [続行]アクションを組み込むために変更する繰り返しアクション内で、[続行]アクションを配置する[ループ]アクション内部の位置を選択します。

    通常、これは[決定]アクションのどちらか一方の枝の内部です。

  2. [アクション]メニューから、[新規アクション]>[繰り返し]>[続行]の順に選択します。

    [続行]アクションがアクションモデルに表示されます。

グループの宣言

この項では、次のトピックについて説明します。

[グループの宣言]アクションについて

[グループの宣言]アクションは、DOMに関する2つの特別なリストを作成するときに使用します。作成したこれらのグループリストは、[グループの繰り返し]アクションでループの基礎として使用できます。リストを作成するには、グループ名とXPathを指定します。次いで、統合アクティビティは次のようにリストを作成します。

  • グループリストを作成します。このリストには、XPathと一致するすべての要素で検出された固有値ごとに1つのエントリが含まれます。グループリストの名前は、指定したグループ名で示されます。

  • グループリストの各固有エントリに関する詳細リストを作成します。このリストには、グループに属するメンバーの数のエントリが含まれます。詳細リストの名前は、指定したグループ名の後ろにラベル(Detail)を付けた形で示されます。

グループを使用すると、入力DOMの繰り返し要素を選択し、その繰り返し要素のすべての兄弟の間で固有な値を使用することで、作成する要素の数を減らすことができます。出力DOMでは、要素が重複せず、固有な要素値ごとに要素が1つ存在します。

[グループの宣言]アクションの追加
  1. アクションモデル内で[グループの宣言]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[繰り返し]>[グループの宣言]の順に選択します。

  3. [グループ名]フィールドにグループの名前を入力します。

  4. 複数のグループレベルを作成する場合は、これまでに定義したグループが含まれている[親グループ]リストからグループを選択します。

  5. [追加]をクリックします。[要素の追加]ダイアログボックスが表示されます。

  6. パート名と要素を選択します。

  7. [OK]をクリックします。

  8. ステップ 5からステップ 7を繰り返して、グループに要素をさらに追加します。

  9. グループに必要なすべての要素が揃ったら、[OK]をクリックします。

要素の繰り返し

この項では、次のトピックについて説明します。

[要素の繰り返し]アクションについて

[繰り返し]アクションはアクションモデル内にループ構造を作成します。ループを使用すると、1つ以上の一連のアクションを繰り返すことができます。ループには、[要素の繰り返し]、[グループの繰り返し]、[次の間の繰り返し]の3種類があります。

XMLでは、ドキュメント内に、1つの要素のインスタンスを複数含めることができます(データベーステーブルに複数のレコードがあることに似ています)。インスタンスの数はドキュメントごとに異なる可能性があり、ドキュメントスキーマ(DTDまたはXMLスキーマ)に定義されます。たとえば、毎日の請求書の項目を含むXMLドキュメントを受信するとします。XMLドキュメントの項目の数は毎日異なります。XMLドキュメントに「項目」のインスタンスがいくつあるのかがわからないと、この項目の数を入力XMLドキュメントから出力XMLドキュメントにプログラムによって転送する場合、問題になります。[要素の繰り返し]アクションはこの問題を解決します。

[要素の繰り返し]アクションを使用すると、複数回出現する要素にマークを付けることができます。このアクションは、マークが付いた要素の各インスタンスに対して、次のインスタンスが存在しなくなるまで1つ以上のアクションを実行する処理ループを設定します。前述の例では、処理ループに項目数を転送する単一の[マップ]アクションが含まれ、このアクションはすべての項目がマップされるまで繰り返されます。

[要素の繰り返し]アクションは、別名の概念も使用します。別名は2つの役割を果たします。別名はマークが付いた繰り返し要素の代替名または省略名なので、長いXPath式を何回も指定せずに済みます。場合によっては、繰り返し要素がドキュメント階層の数レベル下にあることもあります。マークが付いた子要素を転送する[マップ]アクションを[繰り返し]ループ内に作成する場合に、別名を使用すれば長いXPath式を入力し直すよりも短時間で済みます。別名は、[繰り返し]ループ内の[マップ]アクションにとって、ループが処理されるたびに繰り返し要素の次のインスタンスを使用するための標識にもなります。別名を使用しない[要素の繰り返し]ループ内の[マップ]アクションは、常にソースメッセージ内の要素の最初のインスタンスを参照します。

[要素の繰り返し]アクションを使用すると、ループ内で複数のアクションを処理できます。最も単純な例として、現在の要素インスタンスの値を入力パートから出力パートに転送する[マップ]アクションが繰り返しループに1つだけ含まれている場合があります。この処理ループに複数のアクションを定義することもできます。たとえば、現在の値を転送する[マップ]アクションや、各転送の監査を作成してファイルに書き込む[ログ]アクションがあります。

[要素の繰り返し]アクションの追加
  1. アクションモデル内で[要素の繰り返し]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[繰り返し]>[要素の繰り返し]の順に選択します。

  3. [ソース]情報を指定します。

    1. 別名をソースの[別名]フィールドに入力します。

      別名の命名規則として良いのは、要素名にソースまたはターゲットを示すプレフィックスと繰り返しアクションの種類を付けて使用するというものです(S1Lineitemなど)。

    2. XPath式を入力するか、またはECMA式ビルダボタンをクリックして繰り返し要素のXPath式を作成します。

  4. [ターゲット]情報を指定します。

    1. ターゲットの[別名]フィールドに別名を入力します。

    2. 既存の要素を更新するのではなく新しい要素を追加する繰り返しアクションがある場合は、[常に新しい出力要素を作成する]を選択します。

    3. XPath式を指定するか、またはECMA式ビルダボタンをクリックして繰り返し要素のXPath式を作成します。

  5. [OK]をクリックします。[要素の繰り返し]ループがアクションモデルに追加されます。

  6. アクションモデルで[ループアクション]をクリックして、ループ内で実行するアクションの追加を開始します。

グループの繰り返し

この項では、次のトピックについて説明します。

[グループの繰り返し]アクションについて

受信するXMLドキュメントの形式が、常に自分のビジネスプロセスの要件に合う形式であるとは限りません。[グループの繰り返し]アクションを使用すると、データを再構築し、データの集計値を計算するフレームワークを確立できます。グループ化により、入力データの繰り返し要素を選択し、その繰り返し要素のすべての兄弟の間で固有な値を使用することで、作成する要素の数を減らすことができます。

[グループの繰り返し]アクションは、[グループの宣言]アクションによって作成される2つのリストのいずれかに基づいて、処理ループを設定します。ループは、使用するリスト(グループリストと詳細リストのどちらか)内にあるエントリ数と同じ回数だけ実行されます。[グループの繰り返し]と[マップ]コマンドを組み合わせることにより、元のものとは異なる構造とデータを持つ新しいXMLドキュメントを作成できます。

[要素の繰り返し]アクションと同じく、[グループの繰り返し]アクションも別名の概念を使用します。[グループの繰り返し]ダイアログボックスで使用するソースグループの値は、[グループの宣言]アクションで作成されたリスト名です。リスト名は2つの役割を果たします。リスト名は、ループ内の[マップ]アクションのXPathソースの代替名または省略名です。リスト名を使用することで、長いXPath式を何回も指定せずに済みます。グループリスト名を[マップ]アクションソースのDOM名の代わりに使用すると、グループリスト名は[繰り返し]ループ内の[マップ]アクションにとって、ループが処理されるたびにグループリストの次のインスタンスを使用するための標識にもなります。グループ名を使用しない[グループの繰り返し]ループ内の[マップ]アクションは、常にソースパート内の要素の最初のインスタンスを参照します。

[グループの繰り返し]アクションで作成されたターゲット別名も、2つの役割を果たします。ターゲット別名はループ内の[マップ]アクションのXPathターゲットの代替名または省略名です。ターゲット別名を使用することで、長いXPath式を何回も指定せずに済みます。ターゲット別名をパート名の代わりに使用すると、ターゲット別名は繰り返しループ内の[マップ]アクションにとって、ターゲットメッセージパートでソースの新しいインスタンスを作成するための標識にもなります。ターゲット別名を使用しない[グループの繰り返し]ループ内の[マップ]アクションは、常に、ターゲットメッセージパート内に作成された最初のインスタンスを、ソースグループリストの後続のインスタンスで上書きします。

[グループの繰り返し]アクションの作成は次の3つの作業から成ります。

  • [グループの宣言]アクションを作成して、グループリストを作成する。

  • [グループの繰り返し]アクションを作成して、どのグループリストを使用するかを指定する。

  • ループ内に[マップ]アクションを作成する。

[グループの繰り返し]アクションの追加
  1. アクションモデル内で[グループの繰り返し]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [アクション]>[新規アクション]>[繰り返し]>[グループの繰り返し]の順に選択します。

  3. [ソース]セクションで、[グループの繰り返し]アクションループの基になるグループ名を[場所]リストから選択します。

  4. 必要に応じて、[場所]フィールドにWhere文節を入力してグループリストをフィルタするか、またはECMA式ビルダアイコンをクリックしてWhere式を作成します。

  5. ターゲット要素の別名がわかっている場合は、[別名]フィールドに名前を入力します。

  6. 別名がわからない場合は、[XPath]ボタンを選択してリストから要素を選択するか、または[式]ボタンを選択して式を入力します(またはECMA式ビルダボタンをクリックして式を作成します)。

  7. [OK]をクリックします。

次の間の繰り返し

この項では、次のトピックについて説明します。

[次の間の繰り返し]アクションについて

[次の間の繰り返し]アクションは、指定した条件がTrueである限り1つ以上のアクションを繰り返します。[次の間の繰り返し]アクションに作成するターゲット別名は、2つの役割を果たします。ターゲット別名はループ内の[マップ]アクションのXPathターゲットの代替名または省略名です。ターゲット別名を使用することで、長いXPath式を何回も指定せずに済みます。ターゲット別名を[マップ]アクションのDOM名の代わりに使用すると、ターゲット別名は繰り返しループ内の[マップ]アクションにとって、ターゲットDOMでソースの新しいインスタンスを作成するための標識にもなります。ターゲット別名を使用しない[グループの繰り返し]ループ内の[マップ]アクションは、常に、ターゲットDOM内に作成された最初のインスタンスを、ソースの後続のインスタンスで上書きします。

メモ:[要素の繰り返し]や[グループの繰り返し]とは異なり、[次の間の繰り返し]はDOMツリーのデータに基づく必要がありません。DOMツリーのデータとは独立してループを操作できます。

[次の間の繰り返し]アクションの追加
  1. アクションモデル内で[次の間の繰り返し]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[繰り返し]>[次の間の繰り返し]の順に選択します。

  3. [次の間]フィールドに、[次の間]ループをテストする式を入力するか、またはECMA式ビルダボタンをクリックして式をビルドします。

  4. [インデックス変数]フィールドに、ループの状況を監視する変数の名前を入力します。

  5. ターゲット要素の別名がわかっている場合は、[別名]フィールドに名前を入力します。

  6. 別名がわからない場合は、[XPath]ボタンを選択してリストから要素を選択するか、または[式]ボタンを選択して式を入力します(またはECMA式ビルダボタンをクリックして式を作成します)。

  7. [OK]をクリックします。

9.5.4 コメント

この項では、次のトピックについて説明します。

[コメント]アクションについて

[コメント]アクションを使用すると、アクションモデルをドキュメント化して、実行する処理を明確にすることができます。アクションモデル内のどこでもコメントを追加できます。コメントはそれだけでは何も処理しません。

[コメント]アクションの追加

  1. アクションモデル内でコメントを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[コメント]の順に選択します。

  3. コメントを入力します。

  4. [OK]をクリックします。

9.5.5 決定

この項では、次のトピックについて説明します。

[決定]アクションについて

[決定]アクションは、アクションどうしまたはアクションのグループの間に if...then 構成体を作成します。指定した条件に基づいてブランチを選択するときに、[決定]アクションを使用します。条件には= =、<、>、!、>=、<=、(&)、OR (||)、<>などのECMAScript比較演算子を使用する必要があります。式はブール値のTrueまたはFalseステートメントに解決されなければなりません。

[決定]アクションの追加

  1. アクションモデル内で[決定]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[決定]の順に選択します。

  3. ECMAScript式を入力するか、またはECMA式ビルダボタンをクリックしてランタイムでtrueまたはfalseと評価される決定スクリプトを作成します。

  4. [OK]をクリックします。

    次のような[決定]アクションが表示されます。

  5. アクションモデルペインで、[TRUE]ブランチを選択します。

  6. 式がTrueの場合に実行するアクションを1つ以上追加します。

  7. [FALSE]ブランチを選択します。

  8. 式がFalseの場合に実行するアクションを1つ以上追加します。

    [決定]アクションのTRUEまたはFALSEブランチ内部に他の[決定]アクションをネストすることができます。

9.5.6 関数

[関数]アクションについて

[関数]アクションはECMAScript関数を実行します。DOM要素を操作するために、[関数]アクションで呼び出すスクリプトは現在の統合アクティビティ内の完全修飾DOM要素名を参照する必要があります。

作成してアクションモデルに追加したカスタムスクリプト関数は、どのXMLツリー要素に対しても実行できます。たとえば、データ要素の形式を変更する関数を作成できます。要素の内容に対して数値演算関数を実行する関数も作成できます。また、メッセージパートとのやり取りがないファイルシステム関数、データベース関数、URL関数を実行することもできます。

[関数]アクションの追加

  1. アクションモデル内で[関数]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[関数]の順に選択します。

  3. [関数式]フィールドに関数を入力するか、またはECMA式ビルダボタンをクリックしてECMAScript式を作成します。

  4. [OK]をクリックします。

9.5.7 ログ

[ログ]アクションについて

[ログ]アクションは、統合アクティビティにカスタマイズ可能な報告機能を提供します。ログレベル設定値を指定して、報告の程度を制御できます。

[ログ]の使用例は次のとおりです。

  • [試行/フォルト時]条件に達したときに、特定のエラー情報をオペレータコンソールに書き込みます。

  • ECMAScript式を使用して、ランタイムにしかわからない値を持つ変数やDOMの内容に関する情報を記録することにより、デバッグを支援します。

  • [要素の繰り返し]ループの各サイクルから特定の情報をキャプチャします。

[ログ]アクションの追加

  1. アクションモデル内で[ログ]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[ログ]の順に選択します。

  3. 作成するログのタイプを[ログの出力先]グループから選択します。

    [ログ]アクションはアクションで指定した場所に情報を書き込みます。ログ出力先には[システム出力]、[システムログ]、[ユーザログ]の3つの場所があります。

    ログの場所

    説明

    システム出力

    [ログ式]フィールドに指定するメッセージを、設計時にはオペレーティングシステムコンソールに、ランタイムにはアプリケーションサーバコンソールに書き込むには、[システム出力]を選択します。

    メモ:オペレーティングシステムコンソール上にメッセージを表示するには、Eclipse -debugおよび-consoleLog起動パラメータを使用してDesignerを起動します。

    システムログ

    [ログ式]フィールドに指定するメッセージをアプリケーションサーバログファイルに書き込むには、[システムログ]を選択します。

    ユーザログ

    [ログ式]フィールドに指定するメッセージを[ユーザログファイル]フィールドに指定するファイルに書き込むには、[システムログ]を選択します。

  4. [ログレベル]を使用して、この[ログ]アクションの優先度レベル(1から10)を選択します。

    デフォルトの優先度レベルは5です。ログファイルに表示するメッセージには、5から10までの数値を割り当てる必要があります。ここで割り当てる優先度はしきい値の数値(内部的に5に設定されており変更不可)と比較されます。優先度がしきい値以上である場合、メッセージは記録されます。それ以外の場合、ログは記録されません。

  5. コンポーネントを実行するたびにログファイルのデータをクリアする場合は、[ログファイルをクリアする]をオンにします。

  6. [ログの出力先]グループで[ユーザログ]を選択した場合は、[ユーザログファイル]フィールドにログファイルのパスを入力するか、または[参照]を使用してログファイルを指定します。

    存在しないファイルを指定すると、そのファイルが作成されます。Windows*システムの場合、パスを入力するときには、パスに円記号が出現する箇所には必ず1つ余分に円記号を追加します(たとえば、C:\WindowsはC:\\Windowsとします)。

  7. ログに記録するメッセージを[ログ式]フィールドで作成します。

    フィールドにメッセージを入力するか、またはECMA式ビルダを使用して式を作成します。

9.5.8 マップ

この項では、次のトピックについて説明します。

[マップ]アクションについて

[マップ]アクションは、DOMノードの入出力マッピングを実行します。このアクションは、あるドキュメントコンテキストのデータを別のドキュメントコンテキストに転送および変換します。コンテキストには2つのパートがあります。通常、最初のパートはDOMを識別し、2番目のパートはDOM内の場所を識別します。統合アクティビティの基本ドキュメントコンテキストは、DOM名にXPath式で表した要素の場所を組み合わせて示されます。DOM名は通常Input、Output、_System Fault、またはProjectです。 DOM内の場所を識別するXPath式には、パス要素が「/」で区切って指定されています。

メモ:統合アクティビティのコンテキストは、それ自体は単にXPath式の別名または省略名であるグループ名にすることもできます。

デフォルトのマッピング動作

[マップ]アクションを使用してXMLドキュメント内の要素と属性をマップすると、特定のデフォルト動作が生じます。次の表に、これらのデフォルト動作を示します。

表 9-5 デフォルトのマッピング動作

マップタイプ

デフォルトの動作

リーフ要素からリーフ要素へ

要素データのみを転送します。

リーフ要素からブランチ要素へ

要素データのみを転送します。

ブランチ要素からリーフ要素へ

ブランチ全体(ブランチの下のすべての子要素と属性データを含む)を転送します。

ブランチ要素からブランチ要素へ

ターゲットの現在のブランチを削除した後、ブランチ全体(ブランチの下のすべての子要素と属性データを含む)を転送します。

リーフ要素のリストに含まれる特定のリーフ要素から要素へ

選択したリーフの要素データ(または要素インスタンス)をターゲット要素へ転送します。

属性から属性へ

属性データのみを転送します。

要素から属性へ

要素データを属性データに転送します。

属性から要素へ

属性データのみを転送します。

これらの動作の多くは、[高度なマッピング]ダイアログボックスを使用してアクションごとに変更できます(「[詳細]マッピングオプション」を参照)。

マークアップを含むリーフ要素

ランタイムにJavaまたはECMAScript操作によって要素が入力されると、問題が発生する場合があります。要素はマークアップ(<>などの不正な文字を含む文字列)が含まれるデータを受信する場合があります。統合アクティビティがこのような要素の内容を出力DOMのノードにマップしようすると、出力ドキュメントの形式が不正になります。統合アクティビティでは、マークアップを含むすべてのデータをターゲットドキュメントの新しいCDATAセクションにマッピングすることによって、この問題を解決します。

メモ:設計時にマークアップが入力されている場合は、動作が異なります。マークアップをノードに入力して[ソース]ビューで生XMLを調べてみると、ノードに入力したマークアップ文字がエンティティに変換されていることに気づきます。たとえば、「<」文字は&lt;に変換されています。

[マップ]アクションの追加

  1. アクションモデル内で[マップ]アクションを追加する位置の1つ上の行を右クリックします(選択した行の下に新しいアクションが挿入されます)。

  2. [新規アクション]>[マップ]の順に選択します。

  3. [ソース]セクションで、[XPath]を選択します。

  4. リストからパート(入力、出力、_SystemFault、プロジェクト)を選択してから、適切なXPath式を入力するか、またはECMA式ビルダを使用して必要な要素を選択します。

    それと同時に、パート名とXPathに[マップ]アクションのソースコンテキストを指定します。

  5. ステップ 3ステップ 4を[ターゲット]セクションについて繰り返します。

  6. マッピングをさらに調整するには、[詳細](「[詳細]マッピングオプション」を参照)または[コンテンツエディタ](「コンテンツエディタを使用した要素の変換」を参照)オプションを選択します。

    [適用]をクリックすると、ダイアログボックスを閉じないで[マップ]アクションの影響を確認できます。この方法で、[マップ]アクションを繰り返し編集して、すぐに結果を確認することができます。

  7. [OK]をクリックします。

[詳細]マッピングオプション

[マップ]ダイアログボックスの[詳細]オプションを選択すると、[詳細]ダイアログボックスが表示されます。[詳細]ダイアログボックスで設定するオプションは、現在の[マップ]アクションにのみ影響します。

図 9-10 詳細

このダイアログボックスのオプションでは、入力パートノードを出力パートにマップする方法を細かく調整できます。

この項では、次のトピックについて説明します。

属性のコピー

[属性のコピー]を使用して、属性をマップする方法を指定します。[属性のコピー]には次のオプションがあります。

表 9-6 [属性のコピー]オプション

オプション

説明

リーフ以外のルートノードと従属要素の場合

端点ではない(リーフ以外の)要素を出力にマップする場合に、要素(その属性を除く)とその子を出力にマップすることを指定します。子の属性データは含まれますが、元の(親)要素の属性データは含まれません。

Never

マッピング時に属性データを(親ノードからもリーフノードからも)継承しないことを指定します。

常時

すべてのノードのすべての属性データを出力にマップすることを指定します。

ディープコピー

デフォルトの統合アクティビティの動作では、一度にすべてのブランチをマップします(ターゲットノードとそのすべての子)。この操作をディープコピーを呼びます。場合によっては、この動作をオフにして、子を除いた親要素だけをコピーすることもできます。ディープコピーを無効にするには、[従属要素のマップ]の選択を解除します。

ターゲットの作成

[ターゲットの作成]は、ソースノードがソースDOMにあるかどうかに基づいて、[マップ]アクションの[ターゲット]グループに指定した宛先ノードを作成する場合に使用します(「[マップ]アクションの追加」を参照)。デフォルトでは、ランタイムソースDOMにマッピングのソースXPathで指定したノードが含まれているかどうかにかかわりなく、統合アクティビティは常にターゲットを作成します。

たとえば、[マップ]アクションで、ソースXPathを次のように指定したとします。

$Input/Root/MySourceElement

ターゲットXPathで、次のように指定したとします。

$Output/Root/MyParentNode/SomeOtherElement

着信する入力ドキュメントにRoot/MySourceElementに対応するノードがない場合、統合アクティビティはデフォルトで空のRoot/MyParentNode/SomeOtherElementノードを出力DOMに作成します。場合によっては、これが希望する処理ではないこともあります。[ターゲットの作成]マッピングを使用することにより、デフォルト動作を変更できます。

表 9-7 ターゲットの作成

オプション

説明

ソースが存在する場合のみ

ソースXPathに指定されたノードが入力メッセージに存在していない場合は、[マップ]アクションをスキップすることを指定します(ターゲットノードは出力DOMに作成されません)。

エラーの生成

ソースXPathに指定されたノードが入力ドキュメントに含まれていない場合、ランタイムにエラーと見なされることを指定します。したがって、[マップ]アクションを[Try/OnError]ブロックでラップして、エラーを処理できるようにするよう計画します。

常時

ターゲットノードを必ず作成することを指定します(デフォルトの動作)。[常時]を選択すると、[デフォルト値]フィールドを使用してターゲット要素のデフォルトデータ値を指定することができます。

ターゲットをCDATAセクションとして作成

[ターゲットをCDATAセクションとして作成]は、要素データをCDATAセクションにマップする方法を制御するときに使用します。

表 9-8 ターゲットをCDATAセクションとして作成

オプション

説明

ソースにマークアップが含まれる場合のみ

ソースデータに(このコンテキストで)不正な文字が使用されているXML、HTML、または他のタイプのマークアップが含まれている場合に、データをターゲットDOMのCDATAセクションに変更せずに配置することを指定します。これはデフォルトの動作です。

Never

ソースデータを出力用にCDATAセクションでラップしないことを指定します。ソースデータに出現する不正な文字は、出力側でエスケープされたエンティティに変換されます(たとえば、>は&gt;に変換されます)。

常時

どのような形式のソースデータであっても、出力時にCDATAセクションでラップすることを指定します。

コンテンツエディタを使用した要素の変換

コンテンツエディタは、入力要素のフォーマットおよびコンテンツを出力要素の要件に合わせて変更するときに使用します。コンテンツエディタを使用することにより、入力データを小さいパーツにスライスし、パーツ相互の相対的な位置を移動させたり、新しいパーツを追加したり、一部のパーツを省略したり、個々のパーツに関数を適用したりできます。

  1. アクションモデルで、異なるパートから(たとえば、入力パートと出力パートから)マップする2つの要素を選択します。

  2. [新規アクション]>[マップ]の順に選択します。

  3. [マップ]アクションダイアログボックスで(「[マップ]アクションの追加を参照)、[コンテンツエディタ]チェックボックスを選択し、[コンテンツエディタ]ボタンをクリックします。

  4. 必要に応じて、[新規サンプル]をクリックしてサンプル文字列を入力します。

  5. [OK]をクリックして[コンテンツエディタ]ダイアログボックスに戻ります。

  6. [サンプル]セクションで、サンプルの上にあるスライダを切り取り開始位置に移動してから、サンプルの下のスライダを切り取り終了位置に移動します。

    これらのスライダにより、入力データから部分文字列をどのように取り出すかが決まります。

  7. [適用]をクリックします。

    部分文字列は別個のオブジェクトとして[結果]フィールドにコピーされます。

  8. サンプルの各部分について任意の順序で、ステップ 6ステップ 7を繰り返します。

    この方法を使用することにより、元の入力の部分文字列から新しい文字列を取り出して作成することができます。

  9. [結果]フィールドのオブジェクトの形式を変更するには、次のようにします。

    1. オブジェクトを選択します。

    2. [変更]をクリックします。

      [切り取りを開始する文字]フィールドには、最初の切り取りを行う文字列内の文字が表示されます。最初の[出現箇所]フィールドには、いつ切り取りを行うかが示されます。上の図では、最初の切り取りが文字1の最初の出現箇所で行われます。[切り取りを終了する文字]フィールドには、最後の切り取りを行う文字列内の文字を表示します。2番目の[出現箇所]フィールドには、いつ切り取りを行うかが示されます。[オフセット]フィールドには、オブジェクトの開始位置にする、元の文字列の始めからの文字数が表示されます。[長さ]フィールドにはオブジェクトの長さが表示されます。

    3. 必要に応じて、[スクリプト式]フィールドにECMAScript式を入力して、コンテンツ領域を変更できます。

      [スクリプト式]フィールドに示されている「%r」は、関数を適用するコンテンツ領域を表すローカル変数です。たとえば、.toUpperCase()関数をコンテンツ領域に適用するには、var test='%r'; test.toUpperCase()というスクリプト式を入力します。

    4. オブジェクトに定数を割り当てるには、[定数]を選択してから、定数文字列を入力します。

    5. コンテンツエディタで文字列形式のマッピングが完了したなら、[OK]をクリックして変更内容を保存し、コンテンツエディタを閉じます。

  10. [OK]をクリックして、アクションモデルに戻ります。