プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle SOA SuiteでのSOAアプリケーションの開発
12c (12.1.3)
E53007-05
目次へ移動
目次

前
次

6 BPELプロセスでのXMLデータの操作

この章では、BPELプロセス・サービス・コンポーネントでのXMLデータの操作方法について説明します。この章では様々な例を提供します。変数、シーケンスおよび配列の使用方法とXPath式の使用方法、数学的計算などのタスクの実行方法に関するトピックが含まれています。サポートされる仕様についても説明しています。

この章の内容は次のとおりです。

注意:

この章の大部分の例では、関連するメッセージ・タイプを定義するWSDLファイルは、Remote Procedure Call (RPC)形式ではなくドキュメント・リテラル形式であると想定しています。RPC形式のWSDL定義の場合、XPath問合せ文字列の構成方法に違いがあります。RPCのWSDLファイルで定義されたタイプを使用する場合は、「ドキュメント形式とRPC形式のWSDLの違いの理解」を参照してください。

6.1 BPELプロセスでのXMLデータの操作の概要

この項では、BPELプロセスでのXMLデータの使用について概要を説明します。

6.1.1 BPELプロセスのXMLデータ

BPELプロセス・サービス・コンポーネントでは、ほとんどのデータはXMLフォーマットです。データには、BPELプロセス・サービス・コンポーネントとの間で受け渡されるメッセージ、外部サービスとの間で交換されるメッセージ、プロセスで使用されるローカル変数などがあります。通常は次のいずれかのXMLスキーマを使用して、これらのメッセージおよび変数のタイプを定義します。

  • フローのWeb Services Description Language (WSDL)ファイル

  • 起動されるサービスのWSDLファイル

  • そのWSDLファイルで参照されるXSDファイル

したがって、BPELのほとんどの変数はXMLデータであり、BPELプロセス・サービス・コンポーネントはそのコードの大部分を使用して、これらのXML変数を操作します。通常は、様々なサービスに必要な表現間でのデータ・トランスフォーメーション、データのローカル操作(複数のサービス呼出しからの結果の結合など)などが行われます。

BPELでは、サービス・データ・オブジェクト(SDO)変数もサポートしています。この変数は、XML形式ではなく、メモリー構造形式です。

6.1.2 assignアクティビティでのデータ操作およびXPath標準

BPELのデータ操作は、XPath標準に基づくassignアクティビティが開始点になります。このタイプの操作では多くの場合、XPath問合せ、式および関数が使用されます。

通常は、より複雑なデータ・トランスフォーメーションまたは操作を行うためのXQuery、XSLTまたはJavaを使用する高度な方法も使用できます。

この項では、BPELでXMLデータを操作する方法の概要を説明します。様々な組合せで使用される主要なビルディング・ブロックの概要を示し、例をあげて説明します。後続の各項では、これらのビルディング・ブロックを適用して特定のタスクを実行する方法について説明します。

XML変数間でデータをコピーする場合、または式の値を計算して変数に格納するには、assignアクティビティを使用します。アクティビティ内のcopy要素は、互換性のあるタイプの割当てのソースとターゲット(コピー先とコピー元の内容)を指定します。

次の例に、に記載されているBPELバージョン1.1の正式な構文を示します。

<assign standard-attributes>
   standard-elements
   <copy>
      from-spec
      to-spec
   </copy>
</assign>

次の例に、に記載されているBPELバージョン2.0の正式な構文を示します。keepSrcElementName属性は、コピー操作中に(to-specの選択に従って)宛先の要素名が、(from-specの選択に従って)ソースの要素名で置換されるかどうかを指定します。keepSrcElementNameno (デフォルト値)に設定すると、元の宛先要素の名前(つまり、ネームスペース名とローカル名のプロパティ)が、作成される要素の名前として使用されます。keepSrcElementNameyesに設定すると、ソース要素名が、作成される宛先要素の名前として使用されます。

<assign validate="yes|no"? standard-attributes>
   standard-elements
   (
   <copy keepSrcElementName="yes|no"? ignoreMissingFromData="yes|no"?>
      from-spec 
      to-spec
   </copy>
   . . .
   . . .
</assign>

この構文は、両方の仕様で詳細に説明されています。通常、from-specおよびto-specは、次の例に示すように、変数または変数パートを指定します。

<assign>
   <copy>
      <from variable="c1" part="address"/>
      <to variable="c3"/>
   </copy>
</assign>

Oracle JDeveloperを使用する場合は、「From」セクションと「To」セクションを備えた「コピー・ルール」ダイアログでassignアクティビティの詳細を指定します。これにより、前述のBPELソース・コードの構文が反映されます。

XPath標準は、assignアクティビティで主要な役割を果たします。概要として、簡単な例をここに示します。その他のコンテキストでの例および説明は、後続の各項に示します。

  • XPath問合せ

    XPath問合せは、ソースまたはターゲットの変数パート内のフィールドを選択します。from句またはto句には、値がXPath問合せ文字列であるquery属性を含めることができます。次にコードの例を示します。

    <from variable="input" part="payload"
          query="/p:CreditFlowRequest/p:ssn"/>
    

    query属性の値には、ノードを1つのみ選択するロケーション・パスを指定する必要があります。query属性およびXPath標準の構文の詳細は、それぞれ(第14.3項)または(第8.4項)およびを参照してください。

  • XPath式

    XPath式(from句のexpression属性で指定)を使用して、変数に格納する値を指定します。次に例を示します。

    <from expression="100"/>
    

    式には一般的な式(つまり、任意のXPath値のタイプに評価されるXPath式)を指定できます。同様に、式属性の値がコピー操作内のfrom句で使用される場合、式属性の値は必ず1つのノードまたは1つのオブジェクトのみを返す必要があります。XPath式の詳細は、の第9.1.4項を参照してください。

XPath式内では、次の種類の関数をコールできます。

  • コアXPath関数

    XPathでは、文字列操作関数(concatなど)や数値関数(sumなど)を含む多数の組込み関数がサポートされています。

    <from expression="concat('string one', 'string two')"/>
    

    XPath標準に組み込まれた関数の完全なリストは、の第4項を参照してください。

  • BPEL XPath拡張関数

    BPELはいくつかの拡張関数をコアXPath関数に追加し、これによりXPath式がプロセスからの情報にアクセスできます。

    • BPEL 1.1の場合、拡張関数は標準BPELネームスペースhttp://schemas.xmlsoap.org/ws/2003/03/business-process/で定義され、接頭辞bpws:によって指定されます。

      <from expression= "bpws:getVariableData('input', 'payload', '/p:value') + 1"/>
      

      詳細は、の第9.1項および第14.1項を参照してください。getVariableDataの詳細は、「getVariableData」を参照してください。

    • BPEL 2.0の場合も、拡張関数は標準BPELネームスペースhttp://schemas.xmlsoap.org/ws/2003/03/business-process/で定義されます。ただし、接頭辞はbpel:になります。

      <from>bpel:getVariableProperty('input', 'propertyName')</from>
      

      詳細は、の第8.3項を参照してください。getVariablePropertyの詳細は、「getVariableProperty (BPEL 2.0)」を参照してください。

  • Oracle BPEL XPath拡張関数

    Oracleには、新しい関数を追加するためにBPELおよびXPath標準に組み込まれた機能を使用する、その他のXPath関数が用意されています。

    これらの関数は、ネームスペースhttp://schemas.oracle.com/xpath/extensionで定義され、接頭辞ora:によって指定されます。

  • カスタム関数

    Oracle BPEL Process Managerの関数は、bpel-xpath-functions-config.xmlファイルに定義され、orabpel.jarファイルに格納されます。詳細は、「ユーザー定義XPath拡張関数の作成」を参照してください。

高度なデータ操作をBPELのassignアクティビティやコアXPath関数で実行するのは困難な場合があります。ただし、複雑なデータ操作やデータ・トランスフォーメーションは、XSLT、Java、またはassignアクティビティのbpelx操作(「bpelx拡張要素を使用したXMLデータの操作」を参照)を使用したり、Webサービスとして実行することができます。XSLTの場合、には、これらのトランスフォーメーションを実行するXPath関数が組み込まれています。

XPathおよびXQueryトランスフォーメーション・コード例の詳細は、「XSLTマップ・エディタを使用したトランスフォーメーションの作成」および「XQueryマッパーを使用したトランスフォーメーションの作成」を参照してください。

assignアクティビティの詳細は、「Assignアクティビティ」を参照してください。

注意:

assignアクティビティ経由で大きいスキーマが渡されると、「Assignの編集」ダイアログのターゲットまたはソース・ペイロード・ノードを右クリックして「すべての子ノードを開く」を選択した場合に、Oracle JDeveloperが停止したり、メモリー不足になる可能性があります。回避策として、ペイロード要素は手動で開いてください。

6.2 データ・プロバイダ・サービスへのXMLデータ操作の委任

エンティティ変数を使用して、基礎となるデータ・プロバイダ・サービスがBPELデータ操作を実行するように指定できます。データ・プロバイダ・サービスはデータ・ストア内でデータ操作をバックグラウンドで実行しますが、Oracle SOA Suiteが提供する他のデータ・ストア関連の機能(たとえば、データベース・アダプタ)を使用しません。これにより、Oracle SOA Suiteの実行時パフォーマンスが向上し、コンパイルおよび実行時に、基礎となるデータ・プロバイダ・サービスのネイティブ機能が組み込まれます。

エンティティ変数は、SDOベースのデータを使用してOracle Application Development Framework (ADF) Business Componentデータ・プロバイダ・サービスと一緒に使用できます。

11gより前のリリースでは、BPELビジネス・プロセス内で交換された変数およびメッセージは、XML構造に組み込まれる分離されたペイロード(Webサービスから返されるデータのスナップショット)でした。ある場合では、ユーザーにはこの構成要素タイプが必要でした。別の場合では、この構成要素は難題でした。

エンティティ変数は、次のような11gより前のリリースの問題に対応しています。

  • 拡張データ変換

    基礎となるデータがXML形式でない場合は、データ変換(デリミタ付きテキストからXMLへの変換など)が必要でした。基礎となるデータのサイズが大きい場合、処理はパフォーマンスに影響を与える場合がありました。

  • 失効したスナップショット・データ

    (WSDLメッセージを含めて)BPEL内の変数は分離されたペイロードでした。これが必要な場合もありました。別の場合では、Oracle BPEL Process Managerの外部にある他のアプリケーションによって変数が最新データに変更されて表示されることが必要でした。つまり、分離されたデータ・モデルでは、すべてのニーズを満たさない失効したデータ・セットが提供されていました。また、スナップショットによってデータが重複するため、データ・サイズが大きい場合はパフォーマンスに影響を与えていました。

  • ネイティブ・データ動作の損失

    一部のデータ変換の実装には、XMLスキーマの範囲外のデータ構造の適用またはビジネス・データ・ロジックが必要でした。たとえば、開始日は終了日より前である必要があります。変数が分離されたペイロードの場合は、関連するWebサービスの起動中にのみ検証が実行されました。特定の操作後(ただしWebサービスの起動前)に、特別なビジネス・データ・ロジックを必要に応じて実行することが推奨される場合がありました。

リリース11gからリリース12cまででこれらの課題に対応するには、変数宣言時にエンティティ変数を作成します。エンティティ変数は、バックグラウンドで様々なデータ・プロバイダ・サービス・テクノロジにアクセスし、プラグインするためのデータ・ハンドルとして機能します。コンパイルおよび実行時に、Oracle BPEL Process Managerは基礎となるデータ・プロバイダ・サービスにデータ操作を委任します。

表6-1では、以前のリリース(例としてデータベース・アダプタを使用)と、エンティティ変数を使用するリリース11gと12cで、データ変換がどのように実行されるかを説明します。


表6-1 以前および現在のリリースでのデータ操作機能

10.1.xリリース エンティティ変数を使用する場合の11gと12cのリリース

データを明示的にロードして保存するようなデータ操作は、Oracle BPEL Process Managerのデータベース・アダプタにより実行されていました。すべてのデータ(たとえば、注文書)はデータベースのデハイドレーション・ストアに保存されていました。

データをロードして保存するようなデータ操作は、データ・プロバイダ・サービス(Oracle ADF Business Componentアプリケーション)により自動的に実行され、サービスを起動するコードを記述する必要はありません。

Oracle BPEL Process Managerは、注文書データを指し示すキー(たとえば、注文書ID (POID))を格納します。Oracle BPEL Process Managerは、データへのアクセスがリクエストされたときにこのキーをフェッチします(bind entityアクティビティが実行します)。キーを使用してデータをバインドするように明示的にリクエストする必要があります。データ・プロバイダ・サービスは、すべてのデータ変更をデハイドレーション・ストア・データベースとは異なるデータベースに格納します。これによりデータは重複しません。

変数内のデータはドキュメント・オブジェクト・モデル(DOM)形式でした。

変数内のデータはSDO形式であり、DOMより簡単に変換処理できます。特に、データ・プロバイダ・サービスがSDO形式に対応している場合は簡単です。


注意:

現在は、BPELプロセス・サービス・コンポーネントのみがSDO形式の変数を使用できます。コンポジット・アプリケーションに、SDOベースのJavaバインディング・コンポーネント参照と接続されたOracle Mediatorサービス・コンポーネントがある場合、変数のデータ形式のデフォルトはDOMとなります。さらに、表6-1で説明したリリース10.1.xの機能は、リリース11gと12cでもサポートされています。

6.2.1 エンティティ変数の作成方法

この項では、Oracle JDeveloperでエンティティ変数とバインディング・キーを作成する方法について説明します。

Oracle BPEL Process Managerのリリース10.1.xでは、すべての変数データはDOM形式でした。リリース11g以降、リリース12cでも、SDO形式の変数データもサポートされています。BPELプロセス・サービス・コンポーネントのDOMおよびSDO変数は、暗黙的に必要な形式に変換されます。たとえば、DOMベースの変数を使用するOracle BPELサービス・コンポーネントは、これらの変数を必要に応じてassignアクティビティでSDOベースの変数に自動的に変換し、逆の場合も同様に変換します。いずれのタイプの形式もXSDスキーマ・ファイルで定義されています。ユーザーが介入する必要はありません。

エンティティ変数は、SDO形式のデータもサポートしています。ただし、DOM変数やSDO変数とは異なり、SDOベースのデータを持つエンティティ変数を使用すると、データ(たとえば、注文書)に一意のキー値をバインドできます。そのキーのみが、デハイドレーション・ストアに格納されます。変換が必要なデータは、Oracle ADF Business Componentアプリケーションのサービスと一緒に格納されます。キーはサービス内に格納されるデータを指し示します。データが必要な場合はデータ・プロバイダ・サービスからフェッチされ、メモリーに配置されます。プロセスは、bind entityアクティビティとデハイドレーション・ストアの2つの場所で発生します。たとえば、Oracle BPEL Process Managerがリハイドレートする場合は、エンティティ変数のキーのみが格納され、ウェイクアップ時には、暗黙的なバインドが行われて現在のデータが取得されます。

6.2.1.1 インバウンド方向のSDOの動作の理解

SDOバインディング・コンポーネント・サービスは、図6-1に示すように、コンポジット・アプリケーションへのエントリ・ポイントを外部に提供します。

図6-1 インバウンド方向

図6-1の説明が続きます
「図6-1 インバウンド方向」の説明

およびOracle BPELデザイナを使用して次のタスクを実行します。

  • SDOバインディング・コンポーネント・サービスとBPELプロセス・サービス・コンポーネントをコンポジット・アプリケーションに定義します。

  • SDOサービスとBPELプロセス・サービス・コンポーネントを接続(ワイヤ)します。

  • BPELプロセス・サービス・コンポーネントの詳細を定義します。

の使用方法の詳細は、「SOAコンポジット・アプリケーションの開発のスタート・ガイド」を参照してください。

6.2.1.2 アウトバウンド方向のSDO動作の理解

図6-2に示すように、SDOバインディング・コンポーネント参照を使用すると、コンポジット・アプリケーションからOracle ADF Business Componentアプリケーションの外部のパートナにメッセージを送信できます。

図6-2 アウトバウンド方向

図6-2の説明が続きます
「図6-2 アウトバウンド方向」の説明

Oracle ADF Business Componentアプリケーションが外部へのパートナ・リンクの場合、には、アウトバウンド通信を作成するためにコンポジット・アプリケーションにドラッグするSDOバインディング・コンポーネント参照はありません。かわりに、コンポジット・アプリケーションとOracle ADF Business Componentアプリケーションの間に次の通信が発生します。

  • Oracle ADF Business Componentアプリケーションはデプロイされ、自動的にサービス・インフラストラクチャのSDOサービスとして登録されます

  • Oracle JDeveloperを使用してADF-BCサービスとしてこのアプリケーションを参照および検索し、パートナ・リンク接続を作成します。

  • Oracle ADF Business Componentアプリケーション・サービスが検出された場合、composite.xmlファイルは、参照の詳細(binding.adfプロパティ)で自動的に更新されます。

6.2.1.3 エンティティ変数の作成とパートナ・リンクの選択

ここでは、Oracle ADF Business Componentアプリケーションのために、エンティティ変数を作成し、パートナ・リンクを選択します。次の例は、Oracle ADF Business Componentデータ・プロバイダ・サービスの注文データを指し示すために、bind entityアクティビティを使用して、OrderProcessor BPELプロセス・サービス・コンポーネントが注文IDを受け取る方法を示しています。

注意:

エンティティ変数は、BPEL仕様のバージョン1.1または2.0を使用するBPELプロジェクトでサポートされています。

エンティティ変数を作成し、パートナ・リンクを選択する手順は、次のとおりです。

  1. Oracle JDeveloperで、BPELプロセス・サービス・コンポーネントの「構造」ウィンドウに移動します。
  2. 「変数」フォルダを右クリックし、「すべての子ノードを開く」を選択します。
  3. 2番目の「変数」フォルダで、右クリックして「変数の作成」を選択します。

    「変数の作成」ダイアログが表示されます。

  4. 「名前」フィールドに、名前を入力します。
  5. 「エンティティ変数」チェック・ボックスをクリックし、「パートナ・リンク」フィールドの右側の「検索」アイコンを選択します。

    「パートナ・リンク・チューザ」ダイアログに、使用可能なサービス(ADF-BCというSDOサービスを含む)のリストが表示されます。

  6. Oracle ADF Business Componentアプリケーションのためのサービスを参照し、選択します。
  7. 「OK」をクリックし、「パートナ・リンク・チューザ」ダイアログと「変数の作成」ダイアログを閉じます。

    ダイアログは図6-3のようになります。

    図6-3 「変数の作成」ダイアログ

    図6-3の説明が続きます
    「図6-3 「変数の作成」ダイアログ」の説明

6.2.1.4 バインディング・キーの作成

ここでは、Oracle ADF Business Componentデータ・プロバイダ・サービスの注文データを指し示すキーを作成します。

バインディング・キーを作成する手順は、次のとおりです。

  1. 「コンポーネント」ウィンドウで、「Oracle Extensions」を展開します。
  2. 「SDO」セクションまで下にスクロールします。
  3. bind entityアクティビティを、BPELプロセス・サービス・コンポーネントにドラッグします。図6-4に詳細を示します。

    図6-4 「コンポーネント」ウィンドウのbind entityアクティビティ

    図6-4の説明が続きます
    「図6-4 「コンポーネント」ウィンドウのbind entityアクティビティ」の説明

    「Bind Entity」ダイアログが表示されます。

  4. 「名前」フィールドに、名前を入力します。
  5. 「エンティティ変数」フィールドの右側の「検索」アイコンをクリックします。

    「変数チューザ」ダイアログが表示されます。

  6. 「エンティティ変数の作成とパートナ・リンクの選択」で作成したエンティティ変数を選択し、「OK」をクリックします。
  7. 「一意キー」セクションで、「追加」アイコンをクリックします。

    「キーの指定」ダイアログが表示されます。このダイアログを使用して、Oracle ADF Business Componentデータ・プロバイダ・サービスから注文IDを取得するためのキーを作成します。

  8. 表6-2に記載されている詳細を入力し、バインディング・キーを定義します。

    表6-2 「キーの指定」ダイアログのフィールドと値

    フィールド

    キー・ローカル・パート

    キーのローカル・パートを入力します。

    キー・ネームスペースURI

    キーに対するネームスペースURIを入力します。

    キー値

    キー値式を入力します。この式はキーのタイプと一致する必要があります。次に、POIDキーに対する式値キーの例を示します。

    • $inputMsg.payload/tns:poid

    • bpws:getVariableData('inputmsg','payload','tns:poid')

    エンティティ変数に対するPOIDキーは、通常、別のメッセージから取得されます。POIDキーのタイプが整数で、式の結果がABCの文字列である場合、文字列から整数への変換は失敗し、bind entityアクティビティも実行時に失敗となります。


    図6-5に、完成した「キーの指定」ダイアログを示します。

    図6-5 「キーの指定」ダイアログ

    図6-5の説明が続きます
    「図6-5 「キーの指定」ダイアログ」の説明
  9. 「OK」をクリックして「キーの指定」ダイアログを閉じます。

    図6-6に示すように、「一意キー」の表に名前/値ペアが表示されます。これで、設計は完了します。

    図6-6 「エンティティのバインド」ダイアログ

    図6-6の説明が続きます
    「図6-6 「エンティティのバインド」ダイアログ」の説明
  10. 「OK」をクリックして「エンティティのバインド」ダイアログを閉じます。

    実行時にbind entityアクティビティが実行されると、エンティティ変数を使用する準備が整います。

SDOを使用する方法の詳細は、『Oracle Application Development FrameworkによるFusion Webアプリケーションの開発』を参照してください。このガイドには、アプリケーション・モジュールをWebサービスとして公開する方法や、表示データ・オブジェクトの行をSDOとして公開する方法が記載されています。アプリケーション・モジュールは、ビジネス・ロジックを関連する一連のビジネス機能としてカプセル化するADFフレームワーク・コンポーネントです。

6.3 ネイティブ・データとXMLとの間における変換

BPELプロセス変換アクティビティにより、ネイティブXSDフォーマットとXMLフォーマットとの間でメッセージを変換できます。次の変換タイプがサポートされています。

  • インバウンド変換:

    • ネイティブ・フォーマットからXMLへ

    • 不透明からXMLへ

    • ネイティブからディレクトリの添付ファイルへ

  • アウトバウンド変換:

    • XMLからネイティブ・フォーマットへ

    • XMLからディレクトリの添付ファイルへ

  • BPEL 1.1と.2.0の両方のプロジェクトでサポートされています。

インバウンド・メッセージ変換では自動的に、doTranslateFromNative関数を使用します。アウトバウンド・メッセージ変換では自動的に、doTranslateToNative関数を使用します。assignアクティビティを作成して「式ビルダー」ダイアログを起動し、これらの関数を構成する必要はありません。translateアクティビティは、assignアクティビティを自動的に生成します。

6.3.1 ネイティブ・データからXMLデータへの変換方法

この項では、インバウンド・メッセージをネイティブXSDフォーマット(この例では、文字列データ)で受信しXMLフォーマットに変換するために、変換アクティビティをBPELプロセスで構成方法について説明します。ネイティブ・フォーマット・ビルダー・ウィザードを使用して、新しいスキーマ・ファイルを作成します。

ネイティブ・データをXMLデータに変換する手順は、次のとおりです。

  1. BPELプロセスをSOAコンポジット・エディタで右クリックし、「編集」を選択します。

    Oracle BPELデザイナが表示されます。

  2. 「コンポーネント」ウィンドウの「Oracle Extensions」セクションを展開し、変換アクティビティをBPELプロセスにドラッグします。図6-7に詳細を示します。

    図6-7 BPELプロセスの変換アクティビティ

    図6-7の説明が続きます
    「図6-7 BPELプロセスの変換アクティビティ」の説明
  3. 変換アクティビティを右クリックし、「編集」を選択します。

    「変換」ダイアログが編集用に表示されます。

  4. NativeからXMLにを選択して、インバウンド・ネイティブ・データ(この例では、単一の文字列)を受信します。

  5. 「入力」フィールドの右側にある「参照」アイコンをクリックします。

    「変数XPathビルダー」ダイアログが表示されます。

  6. XMLフォーマットに変換するインバウンド・ペイロードの一部であるネイティブ文字列を選択して、「OK」をクリックします。図6-8に詳細を示します。

    図6-8 変数XPathビルダー

    図6-8の説明が続きます
    「図6-8 変数XPathビルダー」の説明
  7. 「NXSDスキーマ」フィールドの右側で、使用するスキーマを選択します。

    • スキーマが存在する場合、「検索」(1番目)アイコンを選択し、「タイプ・チューザ」ダイアログを起動します。

    • スキーマが存在しない場合、2番目のアイコンを選択して、ネイティブ・フォーマット・ビルダー・ウィザードを起動し、スキーマを作成します。

    次の例では、ネイティブ・フォーマット・ビルダー・ウィザードを使用して、カンマ区切りデリミタを使用するテキスト・ファイルから新規スキーマを作成する方法について説明しています。

    1. 「ファイル名とディレクトリ」ダイアログの「ファイル名」フィールドで、名前を入力し、「次へ」をクリックします。

    2. 「タイプの選択」ダイアログで、「デリミタ付き(フィールドが特殊文字で区切られているレコードが含まれています)」を選択し、「次へ」をクリックします。

    3. 「ファイルの説明」ダイアログで、「参照」 をクリックし、カンマ区切りデリミタを使用するテキスト・ファイルを選択します。

      「サンプル・ファイルの選択」ダイアログが表示されます。

    4. 使用するファイルを選択して「OK」をクリックします。

      このファイルの内容が、「ファイルの説明」ダイアログの下部に表示されます。図6-9に詳細を示します。

      図6-9 サンプル・ファイルの内容

      図6-9の説明が続きます
      「図6-9 サンプル・ファイルの内容」の説明
    5. 「次へ」をクリックします。

    6. 「レコード編成」で、「次へ」をクリックします。

    7. 「要素の指定」ダイアログで、レコードを示す要素の名前を入力(この例では、addrを入力)し、「次へ」をクリックします。

    8. フィールドをテキスト・ファイルで区切る特殊文字としてカンマのデフォルト値を「デリミタの指定」ダイアログで受け入れ、「次へ」をクリックします。

    9. 「フィールド・プロパティ」ダイアログの「名前」列で、「C1」「C2」「C3」「C4」「C5」および「C6」のかわりに適切な値を入力し、「次へ」をクリックします。図6-10に詳細を示します。

      図6-10 特定の値で置換される「名前」列デフォルト値

      図6-10の説明が続きます
      「図6-10 特定の値で置換される「名前」列デフォルト値」の説明

      新しいスキーマが生成されたネイティブ・フォーマット・スキーマ・ダイアログに表示されます。

    10. 「テスト」をクリックして、スキーマをテストします。

    11. 「結果XML」セクションで、緑色の矢印をクリックします。

      ネイティブ・スキーマとその結果のXMLが表示されます。図6-11に詳細を示します。

      図6-11 ネイティブ・スキーマのテスト出力

      図6-11の説明が続きます
      「図6-11 ネイティブ・スキーマのテスト出力」の説明
    12. 「OK」をクリックして、生成されたネイティブ・フォーマット・スキーマ・ダイアログに戻ります。

    13. 「次へ」「終了」、の順にクリックします。

      addr_schema1.xsdファイルが生成され、「変換」ダイアログの「NXSDスキーマ」フィールドに表示されます。

  8. 「出力タイプ」リストから、「DOM」を選択します。「DOM」を選択した場合、DOMとSDOMの両方がサポートされます。

  9. 「出力」フィールドの右側で、スキーマの変数を選択します。

    1. 手順7で指定されたスキーマに準拠している出力変数がある場合、「検索」(1番目)アイコンをクリックし、既存の変数を選択します。

    2. 既存の変数がない場合、「追加」(2番目)アイコンをクリックし、「変数の作成」ダイアログを起動します。デフォルト値をそのまま使用するか、変数の名前を変更して出力変数を作成して、「OK」をクリックします。手順7で作成されたスキーマを変数は自動的に指します。

    完成すると、「変換」ダイアログは図6-12のようになります。

  10. 図6-12 ネイティブからXMLに変換するために構成された「変換」ダイアログ

    図6-12の説明が続きます
    「図6-12 ネイティブからXMLに変換するために構成された「変換」ダイアログ」の説明

    同期リクエストの出力は、新しいスキーマを指すように変更する必要があります。

  11. 「アプリケーション」ウィンドウで、BPELプロセスのWSDLファイル(この例では、BPELProcess1.wsdlという名前)を選択します。

  12. Oracle BPELデザイナの下部で、「ソース」をクリックします。

  13. WSDLファイルの<wsdl:message>セクションまでスクロールします。

  14. レスポンス要素(この例では、名前はprocessResponse)をBPELProcess1ResponseMessageメッセージ用にクリックし、プロパティ・インスペクタを右下の隅で起動します。図6-13に詳細を示します。

    図6-13 WSDLファイルのルート要素選択

    図6-13の説明が続きます
    「図6-13 WSDLファイルのルート要素選択」の説明
  15. プロパティ・インスペクタで新規ルート要素を選択します(この例では、ns1:addr)。図6-14に詳細を示します。

    図6-14 プロパティ・インスペクタで選択されたルート要素

    図6-14の説明が続きます
    「図6-14 プロパティ・インスペクタで選択されたルート要素」の説明

    ns1:addrルート要素がWSDLファイルに追加されています。図6-15に詳細を示します。

    図6-15 WSDLファイルで表示される新規ルート要素

    図6-15の説明が続きます
    「図6-15 WSDLファイルで表示される新規ルート要素」の説明
  16. 変換アクティビティの下にあるBPELプロセスにassignアクティビティをドラッグします。

    変換出力変数をBPEL出力変数に割り当てます。

  17. assignアクティビティの「コピー・ルール」タブで、変数をマップし、「OK」をクリックします。図6-16に詳細を示します。

    図6-16 assignの編集ダイアログ

    図6-16の説明が続きます
    「図6-16 assignの編集ダイアログ」の説明

    これで、設計は完了します。

6.3.2 XMLデータからネイティブ・データへの変換方法

この項では、受信したXMLメッセージをネイティブ・データ・フォーマット(カンマ区切り文字列など)に変換する方法について説明します。この例では、「ネイティブ・データからXMLデータへの変換方法」で作成したスキーマ・ファイルをネイティブXSDフォーマットに変換するためのアウトバウンドXMLフォーマットとして使用しています。

XMLフォーマットをネイティブ・データに変換する手順は、次のとおりです。

  1. 同期BPELプロセスを作成します。
  2. 「BPELプロセスの作成」ダイアログの「入力」フィールドで、デフォルトの入力XSDスキーマを受け入れるか、「検索」アイコンをクリックして、異なるXSDを選択します。この例では、「ネイティブ・データからXMLデータへの変換方法」のネイティブ・フォーマット・ビルダーで作成したスキーマが選択されています。図6-17に詳細を示します。

    図6-17 入力スキーマの選択

    図6-17の説明が続きます
    「図6-17 入力スキーマの選択」の説明
  3. BPELプロセスをSOAコンポジット・エディタで右クリックし、「編集」を選択します。

    Oracle BPELデザイナが表示されます。

  4. 「コンポーネント」ウィンドウの「Oracle Extensions」セクションを展開し、変換アクティビティをBPELプロセスにドラッグします。
  5. 変換アクティビティを右クリックし、「編集」を選択します。

    「変換」ダイアログが編集用に表示されます。

  6. 「XMLからネイティブ」を選択して、アウトバウンドXMLデータをネイティブXSDフォーマットに変換します。
  7. 「入力」フィールドの右側にある「参照」(1番目)アイコンをクリックします。
  8. 入力変数を選択します。図6-18に詳細を示します。
  9. 「NXSDスキーマ」フィールドの右側にある「検索」(1番目)アイコンを選択し、「タイプ・チューザ」ダイアログを起動します。
  10. スキーマ・ファイルを選択して「OK」をクリックします。この例では、「ネイティブ・データからXMLデータへの変換方法」と同じスキーマ・ファイルが使用されています。図6-19に詳細を示します。

    図6-19 スキーマ・ファイルの選択

    図6-19の説明が続きます
    「図6-19 スキーマ・ファイルの選択」の説明
  11. 「出力タイプ」リストから、「文字列」を選択します。

    かわりに、「添付ファイル」を指定すると、ダイアログはリフレッシュされ、添付ファイルのディレクトリ場所を指定するための「場所」フィールドが表示されます。「添付ファイル」の選択は、XMLデータが非常に大きいシナリオでは便利です。

  12. 「出力」フィールドの右側で、「検索」(1番目)アイコンをクリックするか、「変数の作成」アイコンをクリックして、タイプ文字列の新しい出力変数を自動的に作成します。
  13. 出力変数を選択して「OK」をクリックします。図6-20に詳細を示します。

    「変換」ダイアログは図6-21のようになります。

    図6-21 アウトバウンド変換用に構成された「変換」ダイアログ

    図6-21の説明が続きます
    「図6-21 アウトバウンド変換用に構成された「変換」ダイアログ」の説明

    これで、設計は完了します。

6.3.3 インバウンド・ネイティブ・データから添付ファイルとして格納されるXMLへの変換方法

この項では、ネイティブ・データ・フォーマットのインバウンド・メッセージを添付ファイルに変換する方法について説明します。添付ファイルは、受信データが非常に大きいシナリオで便利です。

インバウンド・ネイティブXSDフォーマットを添付ファイルに変換するには:

  1. BPELプロセスを作成します(この例では、一方向BPELプロセスが作成されます)。
  2. BPELプロセスをSOAコンポジット・エディタで右クリックし、「編集」を選択します。

    Oracle BPELデザイナが表示されます。

  3. 「コンポーネント」ウィンドウの「Oracle Extensions」セクションを展開し、変換アクティビティをBPELプロセスにドラッグします。
  4. 変換アクティビティを右クリックし、「編集」を選択します。

    「変換」ダイアログが編集用に表示されます。

  5. 「ネイティブからXML」を選択して、インバウンド・ネイティブ・データを添付ファイルに変換します。
  6. 「入力」フィールドの右側にある「参照」(1番目)アイコンをクリックします。
  7. 入力変数を選択します(この例では、巨大な文字列)。図6-22に詳細を示します。
  8. 「NXSDスキーマ」フィールドの右側にある「検索」(1番目)アイコンを選択し、「タイプ・チューザ」ダイアログを起動します。
  9. スキーマ・ファイルを選択して「OK」をクリックします。この例では、「ネイティブ・データからXMLデータへの変換方法」と同じスキーマ・ファイルが使用されています。図6-23に詳細を示します。

    図6-23 スキーマ・ファイルの選択

    図6-23の説明が続きます
    「図6-23 スキーマ・ファイルの選択」の説明
  10. 「出力タイプ」リストから、「添付ファイル」を選択します。

    ダイアログがリフレッシュされ、「場所」フィールドが表示されます。

  11. 「場所」フィールドに、添付ファイルへのディレクトリ・パスを入力します。このフィールドを空白のままにすると、添付ファイルはデータベースに格納されます。
  12. 「出力」フィールドの右側にある「追加」(2番目)アイコンをクリックし、「変数の作成」ダイアログを起動します。
  13. 「OK」をクリックして出力変数を作成します。出力変数はタイプ添付ファイルに属します。

    「変換」ダイアログは図6-24のようになります。

    図6-24 添付ファイルの「変換」ダイアログ

    図6-24の説明が続きます
    「図6-24 添付ファイルの「変換」ダイアログ」の説明
  14. 「OK」をクリックします。
  15. 「アプリケーション」ウィンドウで、BPELプロセスのファイルを選択します。
  16. 「ソース」をクリックします。
  17. 添付ファイル用に指定した場所がhref属性にコピーされることに注意してください。href属性は、手順12で作成されたタイプ添付ファイルの変数の一部です。
    . . .
    <copy>
      <from> '/scratch/sbandyop/tmp/out/dhqa_addr_att.xml'</from>
      <to> $Translate1_OutputVar_1/@href</to>
    </copy>
    . . .
    
  18. 「アプリケーション」ウィンドウで、BPELプロセスのWSDLファイルを選択します。
  19. 「ソース」をクリックします。
  20. ファイルのWSDL定義セクションに追加されたattachmentコードと、手順12で作成された変数により指し示されるhref属性に注意してください。
    . . .
    xmlns:attach="http://xmlns.oracle.com/DHQATranslateApp/DHQATranslateToAttach/BPELProcess1/attachment"
    . . .
    . . .
    . . .
       <element name="attachmentElement">
          <complexType>
             <attribute name="href" type="string"/>
          </complexType>
       </element>
    . . .
    . . .
    

    これで、設計は完了します。

6.4 スタンドアロンSDOベースの変数の使用

スタンドアロンSDOベースの変数は、通常のBPEL XML-DOMベースの変数と類似しています。主な違いは、基礎となるデータ形式がDOMベースではなくSDOベースであることです。したがって、SDOベースの変数は、Java APIアクセス、簡単に使用できる最新のAPI、変更内容のサマリーなど、様々なSDO機能を使用できます。ただし、SDOを使用する場合は、XML-DOMベースの変数を使用する場合にはない複数の制限も適用されます。最も顕著な制限は、SDOがXPath式の小さいサブセットのみをサポートしていることです。

6.4.1 SDOベースの変数の宣言方法

SDOベースの変数を宣言するための構文は、BPEL変数を宣言する構文と類似しています。次の例に詳細を示します。

<variable name="deptVar_s" element="hrtypes:dept" />
<variable name="deptVar_v" element="hrtypes:dept" bpelx:sdoCapable="false" />

自動検出を無効にする場合は、bpelx:sdoCapable="true|false"スイッチを使用します。たとえば、ここでのサンプルの変数deptVar_vは通常のDOMベースの変数です。次に、XSDの例を示します。

<xsd:element name="dept" type="Dept"/>
   <xsd:complexType name="Dept"
    sdoJava:instanceClass="sdo.sample.service.types.Dept">
      <xsd:annotation>
         <xsd:appinfo source="Key"
          xmlns="http://xmlns.oracle.com/bc4j/service/metadata/">
            <key>
               <attribute>Deptno</attribute>
            </key>
            <fetchMode>minimal</fetchMode>
         </xsd:appinfo>
      </xsd:annotation>
      <xsd:sequence>
         <xsd:element name="Deptno" type="xsd:integer" minOccurs="0"/>
         <xsd:element name="Dname" type="xsd:string" minOccurs="0"
 nillable="true"/>
         <xsd:element name="Loc" type="xsd:string" minOccurs="0" nillable="true"/>
         <xsd:element name="Emp" type="Emp" minOccurs="0" maxOccurs="unbounded"
 nillable="true"/>
      </xsd:sequence>
   </xsd:complexType>

6.4.2 XMLからSDOへの変換方法

Oracle BPEL Process Managerでは、DOMとSDOの2つのデータ形式をサポートしています。同じビジネス・プロセス内で、さらに同じ式の中で、DOMベースの変数とSDOベースの変数の使用を切り替えることができます。Oracle BPEL Process Managerのデータ・フレームワークは、DOM形式とSDO形式を自動的に変換します。

Oracle BPEL Process Managerでは、エンティティ変数のXPathリライト機能を使用することで、基本的なSDO仕様ではサポートされない複数のXPath機能(変数の参照、関数コールなど)を使用できます。一方で、SDOベースの変数を使用するXPathには、別の制限があります(andorおよびnotがサポートされないなど)。

次に、XMLからSDOに変換する例を示します。

<assign>
        <copy>
            <from>
   <ns0:dept xmlns:ns0="http://sdo.sample.service/types/"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <ns0:Deptno>10</ns0:Deptno>
      <ns0:Dname>ACCOUNTING</ns0:Dname>
      <ns0:Loc>NEW YORK</ns0:Loc>
      <ns0:Emp>
         <ns0:Empno>7782</ns0:Empno>
         <ns0:Ename>CLARK</ns0:Ename>
         <ns0:Job>MANAGER</ns0:Job>
         <ns0:Mgr>7839</ns0:Mgr>
         <ns0:Hiredate>1981-06-09</ns0:Hiredate>
         <ns0:Sal>2450</ns0:Sal>
         <ns0:Deptno>10</ns0:Deptno>
      </ns0:Emp>
      <ns0:Emp>
         <ns0:Empno>7839</ns0:Empno>
         <ns0:Ename>KING</ns0:Ename>
         <ns0:Job>PRESIDENT</ns0:Job>
         <ns0:Hiredate>1981-11-17</ns0:Hiredate>
         <ns0:Sal>5000</ns0:Sal>
         <ns0:Deptno>10</ns0:Deptno>
      </ns0:Emp>
      <ns0:Emp>
         <ns0:Empno>7934</ns0:Empno>
         <ns0:Ename>MILLER</ns0:Ename>
         <ns0:Job>CLERK</ns0:Job>
         <ns0:Mgr>7782</ns0:Mgr>
         <ns0:Hiredate>1982-01-23</ns0:Hiredate>
         <ns0:Sal>1300</ns0:Sal>
         <ns0:Deptno>10</ns0:Deptno>
      </ns0:Emp>
   </ns0:dept>
            </from>
            <to variable="deptVar_s" />
        </copy>
</assign>

次に、SDO変数のXPath式からDOM変数にコピーする例を示します。

<assign>
        <!-- copy from an XPath expression of an SDO variable to DOM variable -->
        <copy>
            <from expression="$deptVar_s/hrtypes:Emp[2]" />
            <to variable="empVar_v" />
        </copy>
        <!-- copy from an XPath expression of an DOM variable to SDO variable -->
        <copy>
            <from expression="$deptVar_v/hrtypes:Emp[2]" />
            <to variable="empVar_s" />
        </copy>
        <!-- insert a DOM based data into an SDO variable -->
        <bpelx:insertAfter>
            <bpelx:from variable="empVar_v" />
            <bpelx:to variable="deptVar_s" query="hrtypes:Emp" />
        </bpelx:insertAfter>
        <!-- insert a SDO based data into an SDO variable at particular location,
              no XML conversion is needed  -->
        <bpelx:insertBefore>
            <bpelx:from expression="$deptVar_s/hrtypes:Emp[hrtypes:Sal = 1300]" />
            <bpelx:to variable="deptVar_s" query="hrtypes:Emp[6]" />
         </bpelx:insertBefore>
</assign>

次に、SDOデータを削除する例を示します。

<assign>
         <bpelx:remove>
            <bpelx:target variable="deptVar_s" query="hrtypes:Emp[2]" />
        </bpelx:remove>
</assign>

注意:

SDOベースの変数に対するbpelx:append操作は、次の理由によりサポートされていません。

  • SDOベースの変数に対する<copy>操作には、高性能な更新機能があります(<copy>操作の前に<bpelx:append>操作を実行する必要がないなど)。

  • SDOデータ・オブジェクトはメタデータ駆動で、一般的に新しいプロパティを任意に追加することがサポートされていません。

6.5 式定数またはリテラルXMLでの変数の初期化

BPELでは、リテラルXMLを変数に代入する方法が役立つことがよくあります(たとえば、動的データを変数に対するXMLデータ・コンテンツ内の特定のフィールドにコピーする前に、変数を初期化する場合などです)。また、XMLデータ値をプロセスにハード・コーディングするときのテストにも役立ちます。assignアクティビティの「コピー・ルール」タブで「リテラル」アイコンをターゲット・ノードにドラッグすることによって、リテラルXMLを割り当てます。

assignアクティビティでのリテラルXMLの割当ての詳細は、「Assignアクティビティ」を参照してください。

6.5.1 リテラルXML要素の割当て方法

次の例では、リテラルのresult要素をoutput変数のpayloadパートに割り当てます。

<assign>
   <!-- copy from literal xml to the variable -->
   <copy>
      <from>
         <result xmlns="http://samples.otn.com">
            <name/>
            <symbol/>
            <price>12.3</price>
            <quantity>0</quantity>
            <approved/>
            <message/>
         </result>
      </from>
      <to variable="output" part="payload"/>
   </copy>
</assign>

6.6 変数間のコピー

変数間のコピーでは、1つの変数(またはパート)から互換性のあるタイプの別の変数に直接コピーします。どちらの変数でも特定のフィールドを指定する必要はありません。つまり、XPath問合せを指定する必要はありません。

図6-25に示すように、「Assignの編集」ダイアログの「コピー・ルール」タブで、変数のコピーを実行します。

図6-25 変数割当てのための「コピー・ルール」タブ

図6-25の説明が続きます
「図6-25 変数割当てのための「コピー・ルール」タブ」の説明

「コピー・ルール」タブの詳細は、「bpelx拡張要素を使用したXMLデータの操作」および「Assignアクティビティ」を参照してください。

6.6.1 変数間でのコピー方法

次の例は、2つの割当ての実行を示しています。最初に同じタイプの2つの変数の間でコピーを実行し、次に変数パートをそのパートと同じタイプの別の変数にコピーします。

<assign>
   <copy>
      <from variable="c1"/>
      <to variable="c2"/>
   </copy>
   <copy>
      <from variable="c1" part = "address"/>
      <to variable="c3"/>
   </copy>
</assign>

次の例に示すように、BPELファイルは変数を定義します。

<variable name="c1" messageType="x:person"/>
<variable name="c2" messageType="x:person"/>
<variable name="c3" element="y:address"/>

次の例に示すように、WSDLファイルはpersonメッセージ・タイプを定義します。

<message name="person" xmlns:x="http://tempuri.org/bpws/example">
   <part name="full-name" type="xsd:string"/>
   <part name="address" element="x:address"/>
</message>

このコード例の詳細は、の第9.3.2項を参照してください。BPEL 2.0の場合は、の第8.4.4項の類似した例を参照してください。

詳細は、「Assignアクティビティ」を参照してください。

6.6.2 BPEL 2.0のインラインfrom-specを使用した変数を初期化する方法

インラインfrom-specを使用することで、必要に応じて変数を初期化できます。このタイプの変数を作成するには、BPEL 2.0プロジェクトの「変数の作成」ダイアログで「初期化」タブをクリックします。図6-26に詳細を示します。

図6-26 「変数の作成」ダイアログの「初期化」タブ

図6-26の説明が続きます
「図6-26 「変数の作成」ダイアログの「初期化」タブ」の説明

インライン変数の初期化は、概念的には、変数宣言に表示される順序でそれぞれが初期化された、一連の仮想assignアクティビティを含む1つの仮想sequenceアクティビティとして設計されます。各仮想assignアクティビティには、from-specが変数の初期化で指定されている1つの仮想コピー操作が含まれます。to-specは、作成される変数を指します。次の例に詳細を示します。

<variables>
   <variable name="tmp" element="tns:output">
     <from>
       <literal>
         <output xmlns="http://samples.otn.com/bpel2.0/ch8.1">
           <value>1000</value>
         </output>
       </literal>
     </from>
   </variable>
</variables> 

詳細は、の第8.1項を参照してください。

6.7 「構造」ウィンドウでの変数の移動およびコピー

Oracle JDeveloperの「構造」ウィンドウでは、scopeアクティビティ間で変数を移動およびコピーできます。

6.7.1 「構造」ウィンドウで変数を移動する手順:

  1. 「構造」ウィンドウで、scopeアクティビティに移動する変数を選択します。図6-27に詳細を示します。

    図6-27 「構造」ウィンドウで移動する変数

    図6-27の説明が続きます
    「図6-27 「構造」ウィンドウで移動する変数」の説明
  2. scopeアクティビティの「変数」フォルダに変数をドラッグします。

    scopeアクティビティの「変数」フォルダに変数が表示されます(図6-28を参照)。

    図6-28 「構造」ウィンドウでscopeアクティビティに移動された変数

    図6-28の説明が続きます
    「図6-28 「構造」ウィンドウでscopeアクティビティに移動された変数」の説明
  3. BPELプロセスで、scopeアクティビティの「変数」アイコンをクリックします。

    移動した変数が表示されます(図6-29を参照)。

    図6-29 scopeアクティビティの「変数」ダイアログに表示される移動された変数

    図6-29の説明が続きます
    「図6-29 scopeアクティビティの「変数」ダイアログに表示される移動された変数」の説明

6.7.2 「構造」ウィンドウで変数をコピーする手順:

  1. 「構造」ウィンドウで、scopeアクティビティに移動する変数を選択します。

  2. [Ctrl]キーを押したままにします。

  3. scopeアクティビティの「変数」フォルダに変数をドラッグします。

    両方の「変数」フォルダに変数が表示されます(図6-30を参照)。

    図6-30 「構造」ウィンドウでscopeアクティビティにコピーされた変数

    図6-30の説明が続きます
    「図6-30 「構造」ウィンドウでscopeアクティビティにコピーされた変数」の説明

6.8 要素変数およびメッセージ・タイプ変数内のフィールドへのアクセス

ほとんどのWSDLファイルやXSDファイルに定義のタイプが存在する場合は、要素およびメッセージ・タイプに基づいて変数パート内のコピー元またはコピー先フィールドのレベルに移動する必要があります。そこで、XMLスキーマの複合型を順に使用します。このアクションを実行するには、assignアクティビティの「コピー・ルール」タブのfrom句またはto句にXPath問合せを指定します。

「コピー・ルール」タブの詳細は、「bpelx拡張要素を使用したXMLデータの操作」および「Assignアクティビティ」を参照してください。

6.8.1 要素ベース変数およびメッセージ・タイプベース変数内のフィールドへのアクセス方法

次の例では、ssnフィールドはCreditFlowプロセスの入力メッセージから信用格付けサービスの入力メッセージのssnフィールドにコピーされます。

<assign>
   <copy>
      <from variable="input" part="payload"
         query="/tns:CreditFlowRequest/tns:ssn"/>
      <to variable="crInput" part="payload" query="/tns:ssn"/>
   </copy>
</assign>

次の例に、この割当てに必要なメッセージ・タイプベースの変数をBPELファイルで定義する方法を示します。

<variable name="input" messageType="tns:CreditFlowRequestMessage"/>
<variable name="crInput"
          messageType="services:CreditRatingServiceRequestMessage"/>

crInput変数は、信用格付けサービスへの入力メッセージとして使用されます。そのメッセージ・タイプCreditFlowRequestMessageは、次の例に示すように、CreditFlowService.wsdlファイルで定義されます。

<message name="CreditFlowRequestMessage">
<part name="payload" element="tns:CreditFlowRequest"/>
</message>

CreditFlowRequestは、ssnという名前のフィールドで定義されます。メッセージ・タイプCreditRatingServiceRequestMessageは、次の例に示すように、CreditRatingService.wsdlファイルで定義されます。

<message name="CreditRatingServiceRequestMessage">
   <part name="payload" element="tns:ssn"/>
</message>

次の例に、最初の割当て例の割当てに含まれるメッセージ・タイプベース変数をBPELファイルで定義する方法のBPEL 2.0の構文を示します。/tns:CreditFlowRequestは不要であることに注意してください。

<copy>
   <from>$input.payload/tns:ssn</from>
   <to>$crInput.payload</to>
</copy>

BPELプロセスでは、要素ベースの変数も使用できます。次の例に、BPEL 1.1で要素ベースの変数を使用する方法を示します。autoloanフィールドは融資申請プロセスの入力メッセージからWebサービスの入力メッセージのcustomerフィールドにコピーされます。

 <assign>  
      <copy>
        <from variable="input" part="payload" 
           query="/tns:invalidLoanApplication/autoloan:
            application/autoloan:customer"/>
        <to variable="customer"/>
      </copy>
</assign>

次の例に、BPEL 2.0で要素ベースの変数を使用する方法を示します。

<assign>
   <copy>
      <from>$input.payload/autoloan:application/autoloan:customer</from>
      <to>$customer</to>
   </copy>
</assign>

次の例に、割当てに必要な要素ベースの変数をBPELファイルで定義する方法を示します。

    <variable name="customer" element="tns:customerProfile"/>

6.9 数値の割当て

XPath式では数値を割り当てることができます。

6.9.1 数値の割当て方法

次の例は、XPath式に整数値100を割り当てる方法を示しています。

<assign>
   <!-- copy from integer expression to the variable -->
   <copy>
      <from expression="100"/>
      <to variable="output" part="payload" query="/p:result/p:quantity"/>
   </copy>
</assign>

6.10 XPath標準による数学的計算の使用

次の項の式のように、単純な計算式を使用して、数値を増分させることができます。

6.10.1 XPath標準による数学的計算の使用方法

次の例では、BPEL XPath関数getVariableDataにより、増分した値が取得されます。getVariableDataへの引数は、from句のvariable、partおよびquery属性と同じです(オプションの最後の2つの引数を含む)。

<assign>
   <copy>
      <from expression="bpws:getVariableData('input', 'payload',
          '/p:value') + 1"/>
      <to variable="output" part="payload" query="/p:result"/>
   </copy>
</assign>

また、次の例に示すように、BPEL 1.1で$variable構文を使用することもできます。

<assign>
  <copy>
    <from expression="$input.payload + 1"/>
    <to variable="output" part="payload" query="/p:result"/>
  </copy>
</assign>

次の例に、BPEL 2.0で$variable構文を使用する方法を示します。

<assign>
   <copy>
      <from>$input.payload + 1</from>
      <to>$output.payload</to>
   </copy>
</assign>

6.11 文字列リテラルの割当て

assignアクティビティの「コピー・ルール」タブで、文字列リテラルを変数に割り当てることができます。

assignアクティビティの詳細は、「bpelx拡張要素を使用したXMLデータの操作」および「Assignアクティビティ」を参照してください。

6.11.1 文字列リテラルの割当て方法

次の例のコードは、文字列リテラル'GE'から評価されるBPEL 1.1式を、指定された変数パート内のsymbolフィールドにコピーしています。(二重引用符および一重引用符を使用していることに注意してください)。

<assign>
   <!-- copy from string expression to the variable -->
   <copy>
      <from expression="'GE'"/>
      <to variable="output" part="payload" query="/p:result/p:symbol"/>
   </copy>
</assign>

次の例に、BPEL 2.0でこの式を実行する方法を示します。

<assign>
   <copy>
      <from>'GE'</from>
      <to>$output.payload/p:symbol</from>
   </copy>
</assign>

詳細は、「Assignアクティビティ」を参照してください。

6.12 文字列の連結

1つの文字列変数(または変数パート、フィールド)の値を別の文字列変数にコピーするのではなく、いくつかの文字列を連結するなどの文字列操作を最初に実行できます。

6.12.1 文字列の連結方法

連結は、concatというコアXPath関数を使用して実行します。また、連結に含まれる変数値は、BPEL XPath関数getVariableDataを使用して取得します。次の例では、getVariableDatainput変数のpayloadパートからnameフィールドの値をフェッチします。次に、文字リテラル'Hello 'が、この値の先頭に連結されます。

<assign>
   <!-- copy from XPath expression to the variable -->
   <copy>
      <from expression="concat('Hello ',
         bpws:getVariableData('input', 'payload', '/p:name'))"/>
      <to variable="output" part="payload" query="/p:result/p:message"/>
   </copy>
</assign>

XPathで使用できるその他の文字列操作関数は、の第4.2項にリストされています。

6.13 ブール値の割当て

XPathブール関数を使用してブール値を割り当てることができます。

6.13.1 ブール値の割当て方法

次の例に、BPEL 1.1でブール値を割り当てる例を示します。from句のXPath式は、XPathブール関数trueのコールであり、指定されたapprovedフィールドがtrueに設定されます。関数falseも使用できます。

<assign>
   <!-- copy from boolean expression function to the variable -->
   <copy>
      <from expression="true()"/>
      <to variable="output" part="payload" query="/result/approved"/>
   </copy>
</assign>

次の例に、BPEL 2.0でブール値を割り当てる例を示します。

<assign>
   <copy>
      <from>true()</from> 
      <to>$output.payload/approved</to>
   </copy>
</assign>

XPath仕様では、ブール定数値を返すメソッドとして"true()"および"false()"関数を使用するように推奨しています。

かわりに"boolean(true)"または"boolean(false)"を使用すると、ブール関数内のtrueまたはfalsetrueまたはfalse定数ではなく相対要素ステップと解釈されます。現行のXPathコンテキスト・ノードでtrueという子ノードの選択が試行されます。ほとんどの場合、trueノードは存在しません。したがって、空の結果ノードセットが返され、それがXPath 1.0のboolean()関数によりfalseの結果に変換されます。この結果は混同される可能性があります。

6.14 日付または時刻の割当て

Oracle BPEL XPath関数のgetCurrentDategetCurrentTimeまたはgetCurrentDateTimeを使用して、日付または時刻フィールドの現在値を割り当てることができます。さらに、日時の値が標準XSD形式の場合は、Oracle BPEL XPath関数formatDateをコールして、出力用により適切な文字に変換できます。

関連情報は、の第9.1.2項およびの第8.3.2項を参照してください。

XPath関数および式ビルダーの詳細は、「XPath拡張関数」を参照してください。

6.14.1 日付または時刻の割当て方法

次の例に、BPEL 1.1で関数getCurrentDateを使用する例を示します。

<!-- execute the XPath extension function getCurrentDate() -->
<assign>
   <copy>
      <from expression="xpath20:getCurrentDate()"/>
      <to variable="output" part="payload"
         query="ns1:invoice/invoiceDate"/>
   </copy>
</assign>

次の例に、BPEL 2.0で関数getCurrentDateを使用する例を示します。

<assign>
   <copy>
      <from>xpath20:getCurrentDate()</from>
      <to>$output.payload/invoiceDate</to>
   </copy>
</assign>

次の例では、XSD形式で指定された日時の値をformatDate関数が文字列'Jun 10, 2005'に変換し、文字列フィールドformattedDateに割り当てています。

<!-- execute the XPath extension function formatDate() -->
<assign>
   <copy>
      <from expression="ora:formatDate('2005-06-10T15:56:00',
         'MMM dd, yyyy')"/>
      <to variable="output" part="payload"
         query="ns1:invoice/formattedDate"/>
   </copy>
</assign>

次の例に、BPEL 2.0でのformatDate関数の動作を示します。

<assign>
   <copy>
      <from>ora:formatDate('2005-06-10T15:56:00','MMM dd, yyyy')</from>
      <to>$output.payload/formattedDate</to>
   </copy>
</assign>

6.15 属性の操作

XML属性として定義されている要素は相互にコピーできます。XPath問合せ構文では、@記号は子要素のかわりに属性を参照します。

6.15.1 属性の操作方法

次の例のコードは、このXMLデータからcustId属性をフェッチしてコピーしています。

   <invalidLoanApplication xmlns="http://samples.otn.com">
      <application xmlns = "http://samples.otn.com/XPath/autoloan">
         <customer custId = "111" >
            <name>
               Mike Olive
            </name>
            ...
         </customer>
         ...
      </application>
   </invalidLoanApplication>

次の例のBPEL 1.1のコードは、customerフィールドのcustId属性を選択し、変数custIdに割り当てています。

<assign>
   <!-- get the custId attribute and assign to variable custId -->
   <copy>
      <from variable="input" part="payload"
         query="/tns:invalidLoanApplication/autoloan:application
                /autoloan:customer/@custId"/>
      <to variable="custId"/>
   </copy>
</assign>

次の例に、customerフィールドのcustId属性を選択し、変数custIdに割り当てるためのBPEL 2.0の対応する構文を示します。

<assign>
<copy>
<from>$input.payload/autoloan:application/autoloan:customer/@custId</from>
<to>$custId</to>
</copy>
</assign>

この例のネームスペース接頭辞は必須ではありません。次の例に示すように、WSDLファイルは、custIdが属性として定義される型を持つように顧客を定義します。

<complexType name="CustomerProfileType">
   <sequence>
      <element name="name" type="string"/>
      ...
   </sequence>
   <attribute name="custId" type="string"/>
</complexType>

6.16 bpelx拡張要素を使用したXMLデータの操作

assignアクティビティではXMLデータに対して様々な操作を実行できます。この項で説明されているbpelx拡張要素タイプにはこの機能が用意されています。Oracle BPELデザイナでは、「割当て」ダイアログの「コピー・ルール」タブの下部にbpelx拡張要素タイプを追加できます。コピー・ルールを作成した後、作成したルールを選択し、BPEL 1.1のドロップダウン・リストまたはBPEL 2.0のコンテキスト・メニューからbpelx拡張要素タイプを選択します。これにより、コピー・ルールが選択した拡張要素タイプに変更されます。

BPEL 1.1では、図6-31に示すように、ドロップダウン・リストから拡張要素タイプを選択します。

図6-31 BPEL 1.1のbpelx拡張要素に変換されたコピー・ルール

図6-31の説明が続きます
「図6-31 BPEL 1.1のbpelx拡張要素に変換されたコピー・ルール」の説明

BPEL 2.0では、図6-32に示すように、コピー・ルールを右クリックし、ルール・タイプの変更を選択して拡張要素タイプを選択することで、拡張要素タイプを選択します。

図6-32 BPEL 2.0のbpelx拡張要素に変換されたコピー・ルール

図6-32の説明が続きます
「図6-32 BPEL 2.0のbpelx拡張要素に変換されたコピー・ルール」の説明

詳細は、このダイアログのオンライン・ヘルプおよび「Assignアクティビティ」を参照してください。

6.16.1 bpelx:appendの使用方法

assignアクティビティでbpelx:append拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツに追加できます。この拡張機能を使用するには、「コピー・ルール」タブの下部で次の手順の1つを実行します。

  • BPEL 1.1の場合は、図6-31のように、コピー・ルールを選択してドロップダウン・リストから「追加」を選択します。

  • BPEL 2.0の場合、図6-32のように、コピー・ルールを右クリックしてルール・タイプの変更を選択し、「追加」を選択します。

注意:

bpelx:append拡張要素では、SDO変数の使用はサポートされていません。エラーが発生します。

6.16.1.1 BPEL 1.1のbpelx:append

次に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:appendの例を示します。

<bpel:assign> 
   <bpelx:append>
      <bpelx:from ... /> 
      <bpelx:to ... /> 
   </bpelx:append> 
</bpel:assign> 

bpelx:append内のfrom-spec問合せでは、0(ゼロ)個以上のノードが取得されます。ノード・リストは、to-spec問合せで指定したターゲット・ノードに子ノードとして追加されます。

to-spec問合せでは、単一L-Value要素ノードを1つ取得する必要があります。それ以外の場合は、bpel:selectionFailureフォルトが生成されます。to-spec問合せではパートナ・リンクを参照できません。

次の例では、1つの部品表(BOM)の複数のb:partを連結BOMのb:partに追加することで、複数のBOMを1つのBOMに連結しています。

<bpel:assign>
    <bpelx:append>
          <bpelx:from variable="billOfMaterialVar" 
                query="/b:bom/b:parts/b:part" />
          <bpelx:to variable="consolidatedBillOfMaterialVar"
                query="/b:bom/b:parts" />
    </bpelx:append> 
</bpel:assign>

6.16.1.2 BPEL 2.0のbpelx:append

次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:append構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:append」で説明されている機能と同じですが、構文が多少異なります。

<bpel:assign>
   <bpelx:append>
      <bpelx:from>$billOfMaterialVar/b:parts/b:part</bpelx:from>
      <bpelx:to>$consolidatedBillOfMaterialVar/b:parts</bpelx:from>
   </bpelx:append>
</bpel:assign>

6.16.2 bpelx:insertBeforeの使用方法

注意:

bpelx:insertBefore拡張要素ではSDO変数を使用できますが、ターゲットは、コピーされたデータの移動先の変数属性にする必要があります。

assignアクティビティでbpelx:insertBefore拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツの前に挿入できます。この拡張機能を使用するには、「コピー・ルール」タブの下部で次の手順の1つを実行します。

  • BPEL 1.1の場合は、図6-31のように、コピー・ルールを選択してドロップダウン・リストから「前に挿入」を選択します。

  • BPEL 2.0の場合、図6-32のように、コピー・ルールを右クリックして「ルール・タイプの変更」を選択し、「前に挿入」を選択します。

6.16.2.1 BPEL 1.1のbpelx:insertBefore

次に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:insertBeforeの例を示します。

<bpel:assign> 
   <bpelx:insertBefore>
      <bpelx:from ... /> 
      <bpelx:to ... /> 
   </bpelx:insertBefore> 
</bpel:assign>

bpelx:insertBefore内のfrom-spec問合せでは、0(ゼロ)個以上のノードが取得されます。ノード・リストは、to-spec問合せで指定したターゲット・ノードに子ノードとして追加されます。

insertBefore操作のto-spec問合せは、1つ以上の単一L-Valueノードを指し示します。複数のノードが返された場合は、最初のノードが参照ノードとして使用されます。参照ノードは要素ノードである必要があります。参照ノードの親も要素ノードである必要があります。それ以外の場合は、bpel:selectionFailureフォルトが生成されます。from-spec問合せの選択により生成されたノード・リストは、参照ノードの前に挿入されます。to-spec問合せではパートナ・リンクを参照できません。

次の例に、<insertBefore>の実行前の構文を示します。addrVarの値は次のとおりです。

<a:usAddress>
       <a:state>CA</a:state>
       <a:zipcode>94065</a:zipcode> 
</a:usAddress> 

次の例に、実行後の構文を示します。

<bpel:assign>
    <bpelx:insertBefore>
        <bpelx:from>
             <a:city>Redwood Shore></a:city>
        </bpelx:from> 
        <bpelx:to "addrVar" query="/a:usAddress/a:state" /> 
    </bpelx:insertBefore> 
</bpel:assign> 

次の例に、addrVarの値を示します。

<a:usAddress>
       <a:city>Redwood Shore</a:city>
       <a:state>CA</a:state>
       <a:zipcode>94065</a:zipcode> 
</a:usAddress> 

6.16.2.2 BPEL 2.0のbpelx:insertBefore

次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:insertBefore構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:insertBefore」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:insertBefore拡張要素をラップします。

<assign>
   <extensionAssignOperation>
      <bpelx:insertBefore>
         <bpelx:from>
            <bpelx:literal>
               <a:city>Redwood Shore></a:city>
            </bpelx:literal>
         </bpelx:from>
         <bpelx:to>$addrVar/a:state</bpelx:to>
         </bpelx:insertBefore>
   </extensionAssignOperation>
</assign>

6.16.3 bpelx:insertAfterの使用方法

注意:

bpelx:insertAfter拡張要素ではSDO変数を使用できすが、ターゲットは、コピーされたデータの移動先の変数属性にする必要があります。

assignアクティビティでbpelx:insertAfter拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツを別の変数のコンテンツの後に挿入できます。この拡張機能を使用するには、「コピー・ルール」タブの下部で次の手順の1つを実行します。

  • BPEL 1.1の場合は、図6-31のように、コピー・ルールを選択してドロップダウン・リストから「後に挿入」を選択します。

  • BPEL 2.0の場合、図6-32のように、コピー・ルールを右クリックしてルール・タイプの変更を選択し、「後に挿入」を選択します。

6.16.3.1 BPEL 1.1のbpelx:insertAfter

次に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:insertAfterの例を示します。

<bpel:assign> 
    <bpelx:insertAfter>
       <bpelx:from ... /> 
       <bpelx:to ... /> 
    </bpelx:insertAfter> 
</bpel:assign>

この操作は「bpelx:insertBeforeの使用方法」で説明した機能に類似していますが、次の違いがあります。

  • to-spec問合せで複数のL-Valueノードが返される場合は、最後のノードが参照ノードとして使用されます。

  • 参照ノードの前にノードが挿入されるかわりに、参照ノードの後にソース・ノードが挿入されます。

この操作は、conditional-switch+(appendまたはinsertBefore)のマクロとみなすこともできます。

次の例に、<insertAfter>の実行前の構文を示します。addrVarの値は次のとおりです。

<a:usAddress>
       <a:addressLine>500 Oracle Parkway</a:addressLine> 
       <a:state>CA</a:state>
       <a:zipcode>94065</a:zipcode> 
</a:usAddress>

次の例に、実行後の構文を示します。

<bpel:assign>
    <bpelx:insertAfter>
        <bpelx:from>
             <a:addressLine>Mailstop 1op6</a:addressLine>
        </bpelx:from> 
        <bpelx:to "addrVar" query="/a:usAddress/a:addressLine[1]" /> 
    </bpelx:insertAfter> 
</bpel:assign> 

次の例に、addrVarの値を示します。

<a:usAddress>
       <a:addressLine>500 Oracle Parkway</a:addressLine> 
       <a:addressLine>Mailstop 1op6</a:addressLine>
       <a:state>CA</a:state>
       <a:zipcode>94065</a:zipcode> 
</a:usAddress>

bpelx:insertAfter内のfrom-spec問合せでは、0(ゼロ)個以上のノードが取得されます。ノード・リストは、to-spec問合せで指定したターゲット・ノードに子ノードとして追加されます。

6.16.3.2 BPEL 2.0のbpelx:insertAfter

次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:insertAfter構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:InsertAfter」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:insertAfter拡張要素をラップします。

<assign>
   <extensionAssignOperation>
      <bpelx:insertAfter>
         <bpelx:from>
            <bpelx:literal>
               <a:addressLine>Mailstop 1op6</a:addressLine>
            </bpelx:literal>
         </bpelx:from>
<bpelx:to>$addrVar/a:addressLine[1]</bpelx:to>
      </bpelx:insertAfter>
   </extensionAssignOperation>
</assign>

6.16.4 bpelx:removeの使用方法

assignアクティビティでbpelx:remove拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは変数を削除できます。Oracle BPELデザイナでbpelx:remove拡張要素を追加するには、「コピー・ルール」タブの右上隅にある「削除」アイコンを、削除するターゲット変数にドラッグしてカーソルを離します。このアイコンを、センター・キャンバスにドラッグしてダイアログを呼び出し、ルールを指定し、ダイアログを保存して閉じ、アイコンをターゲット・ノードにドラッグすることもできます。図6-33に詳細を示します。

図6-33 assignアクティビティの「コピー・ルール」タブの「削除」アイコン

図6-33の説明が続きます
「図6-33 assignアクティビティの「コピー・ルール」タブの「削除」アイコン」の説明

カーソルを離すと、bpelx:remove拡張要素がターゲット変数に適用されます。図6-34に詳細を示します。

図6-34 ターゲット変数に適用されたbpelx:remove拡張要素

図6-34の説明が続きます
「図6-34 ターゲット変数に適用されたbpelx:remove拡張要素」の説明

6.16.4.1 BPEL 1.1のbpelx:remove

次に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:removeの例を示します。

<bpel:assign> 
    <bpelx:remove>
       <bpelx:target variable="ncname" part="ncname"? query="xpath_str" />
    </bpelx:remove> 
</bpel:assign>

XPath式で指定したノード削除がサポートされます。XPath式では複数のノードを指定できますが、いずれもL-Valueである必要があります。この親からは、テキスト・ノード、属性ノードおよび要素ノードを削除できます。

XPath式では、1つ以上のノードを返すことができます。XPath式で0(ゼロ)個のノードが返される場合は、bpel:selectionFailureフォルトが生成されます。

bpelx:targetの構文は、copy操作のto-specに類似しており、そのサブセットです。

次の例にaddrVarを示します。値は次のとおりです。

<a:usAddress>
       <a:addressLine>500 Oracle Parkway</a:addressLine> 
       <a:addressLine>Mailstop 1op6</a:addressLine>
       <a:state>CA</a:state>
       <a:zipcode>94065</a:zipcode> 
</a:usAddress>

BPELプロセス・サービス・コンポーネント・ファイルで次に示す構文を実行すると、2番目のアドレス行であるMailstopが削除されます。

<bpel:assign>
    <bpelx:remove>
        <target variable="addrVar" 
            query="/a:usAddress/a:addressLine[2]" />
    </bpelx:remove> 
</bpel:assign> 

BPELプロセス・サービス・コンポーネント・ファイルで次に示す構文を実行すると、両方のアドレス行が削除されます。

<bpel:assign>
    <bpelx:remove>
        <target variable="addrVar" 
            query="/a:usAddress/a:addressLine" />
    </bpelx:remove> 
</bpel:assign>

6.16.4.2 BPEL 2.0のbpelx:remove

次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:remove構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:remove」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:remove拡張要素をラップします。

<assign>
   <extensionAssignOperation>
      <bpelx:remove>
         <bpelx:target>$ncname.ncname/xpath_str</bpelx:target>
      </bpelx:remove>
   </extensionAssignOperation>
</assign>

6.16.5 bpelx:renameおよびXSDタイプ・キャストの使用方法

assignアクティビティでbpelx:rename拡張要素を使用すると、BPELプロセス・サービス・コンポーネントはXSDタイプ・キャストを使用して要素の名前を変更できます。Oracle BPELデザイナでbpelx:rename拡張要素を追加するには、「コピー・ルール」タブの右上隅にある「名前の変更」アイコンを、名前を変更するターゲット変数にドラッグしてカーソルを離します。図6-33に示すように、「名前の変更」アイコンは「削除」アイコンの右側に表示されます。カーソルを離すと、ターゲット変数の名前を変更するための「名前の変更」ダイアログが表示されます。このアイコンを、センター・キャンバスにドラッグしてこのダイアログを呼び出し、名前を指定し、ダイアログを保存して閉じ、アイコンをターゲット・ノードにドラッグすることもできます。

6.16.5.1 BPEL 1.1のbpelx:rename

次に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:renameの例を示します。

<bpel:assign>
    <bpelx:rename elementTo="QName1"? typeCastTo="QName2"?>
       <bpelx:target variable="ncname" part="ncname"? query="xpath_str" />
    </bpelx:rename> 
</bpel:assign>

bpelx:targetの構文は、copy操作のto-specに類似しており、そのサブセットです。ターゲットは要素ノードのリストを返す必要があります。それ以外の場合は、bpel:selectionFailureフォルトが生成されます。from-specで指定した要素ノード名が、elementTo属性で指定したQNameに変更されます。その要素ノードにxsi:type属性が追加され、それらの要素がtypeCastTo属性で指定したQNameタイプにキャストされます。

次の例に示す従業員リストがあるとします。

<e:empList>
    <e:emp>
        <e:firstName>John</e:firstName><e:lastName>Dole</e:lastName>
    <e:emp>
    <e:emp xsi:type="e:ManagerType">
        <e:firstName>Jane</e:firstName><e:lastName>Dole</e:lastName>
        <e:approvalLimit>3000</e:approvalLimit>
        <e:managing /> 
    <e:emp>
    <e:emp>
        <e:firstName>Peter</e:firstName><e:lastName>Smith</e:lastName>
    <e:emp>
    <e:emp>
        <e:firstName>Mary</e:firstName><e:lastName>Smith</e:lastName>
    <e:emp>
</e:empList>

昇格の変更が、次の例の従業員リストのPeter Smithに適用されます。

<bpel:assign>
    <bpelx:rename typeCastTo="e:ManagerType">
       <bpelx:target variable="empListVar" 
            query="/e:empList/e:emp[./e:firstName='Peter' and
 ./e:lastName='Smith'" />
    </bpelx:rename> 
</bpel:assign>

前述のキャスト(名前変更)の実行後は、Peter Smithxsi:type情報が追加され、データは次の例に示すようになります。

<e:empList>
    <e:emp>
        <e:firstName>John</e:firstName><e:lastName>Dole</e:lastName>
    <e:emp>
    <e:emp xsi:type="e:ManagerType">
        <e:firstName>Jane</e:firstName><e:lastName>Dole</e:lastName>
        <e:approvalLimit>3000</e:approvalLimit>
        <e:managing /> 
    <e:emp>
    <e:emp xsi:type="e:ManagerType">
        <e:firstName>Peter</e:firstName><e:lastName>Smith</e:lastName>
    <e:emp>
    <e:emp>
        <e:firstName>Mary</e:firstName><e:lastName>Smith</e:lastName>
    <e:emp>
</e:empList>

<approvalLimit>および<managing>がないため、Peter Smithの従業員データは無効になっています。したがって、その情報を追加するために<append>が使用されます。次に例を示します。

<bpel:assign>
    <bpelx:rename typeCastTo="e:ManagerType">
       <bpelx:target variable="empListVar" 
            query="/e:empList/e:emp[./e:firstName='Peter' and
 ./e:lastName='Smith'" />
    </bpelx:rename> 
    <bpelx:append>
       <bpelx:from>
          <e:approvalLimit>2500</e:approvalLimit>
          <e:managing /> 
       </bpelx:from>
       <bpelx:to variable="empListVar" 
            query="/e:empList/e:emp[./e:firstName='Peter' and
 ./e:lastName='Smith'" />
    </bpelx:append> 
</bpel:assign>

renameおよびappendの両方を実行すると、対応するデータは次の例のようになります。

<e:emp xsi:type="e:ManagerType">
     <e:firstName>Peter</e:firstName><e:lastName>Smith</e:lastName>
     <e:approvalLimit>2500</e:approvalLimit>
     <e:managing /> 
<e:emp>

6.16.5.2 BPEL 2.0のbpelx:rename

次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:rename構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:rename」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:rename操作をラップします。

 <bpel:assign>
   <extensionAssignOperation>
      <bpelx:rename elementTo="QName1"? typeCastTo="QName2"?>
         <bpelx:target>$ncname[.ncname][/xpath_str]</bpelx:target>
      </bpelx:rename>
   </extensionAssignOperation>
</bpel:assign>

6.16.6 bpelx:copyListの使用方法

assignアクティビティでbpelx:copyList拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは1つの変数、式またはXMLフラグメントのコンテンツに対して別の変数へのcopyList操作を実行できます。この拡張機能を使用するには、「コピー・ルール」タブの下部で次の手順の1つを実行します。

  • BPEL 1.1の場合は、図6-31のように、コピー・ルールを選択してドロップダウン・リストから「リストのコピー」を選択します。

  • BPEL 2.0の場合、図6-32のように、コピー・ルールを右クリックしてルール・タイプの変更を選択し、「リストのコピー」を選択します。

6.16.6.1 BPEL 1.1のbpelx:copyList

次に、BPELバージョン1.1をサポートするBPELプロジェクトのbpelx:copyListの例を示します。

<bpel:assign> 
    <bpelx:copyList>
       <bpelx:from ... />
       <bpelx:to ... /> 
    </bpelx:copyList>
</bpel:assign>

from-spec問合せでは、すべての属性ノードまたはすべての要素ノードのリストを取得できます。to-spec問合せでは、L-Valueノード(すべての属性ノードまたはすべての要素ノード)のリストを取得できます。

to-spec問合せで返される要素ノードは、すべて同じ親要素を持つ必要があります。to-spec問合せで要素ノードのリストが返される場合は、すべての要素ノードが連続している必要があります。

from-spec問合せで属性ノードが返される場合、to-spec問合せでは属性ノードが返される必要があります。同様に、from-spec問合せで要素ノードが返される場合、to-spec問合せでは要素ノードが返される必要があります。それ以外の場合は、bpws:mismatchedAssignmentFailureフォルトがスローされます。

from-spec問合せでは0(ゼロ)個のノードを返すことができますが、to-spec問合せではノードを1個以上返す必要があります。from-spec問合せで0(ゼロ)個のノードが返される場合、copyList操作の効果はremove操作と同様になります。

copyList操作には、次の機能があります。

  • to-spec問合せが指すノードがすべて削除されます。

  • to-spec問合せで要素ノードのリストが返され、そのノードが削除された後に子ノードが残っている場合、from-spec問合せで返されたノードは、to-spec問合せで指定した最後の要素と同レベルの次の要素の前に挿入されます。残りの子ノードがない場合は、append操作が実行されます。

  • to-spec問合せで属性ノードのリストが返される場合は、その属性が親要素から削除されます。次に、from-spec問合せで返された属性が親要素に追加されます。

たとえば、次に示すようなスキーマが定義されているとします。

<schema attributeFormDefault="unqualified"
        elementFormDefault="qualified"
        targetNamespace="http://xmlns.oracle.com/Event_jws/Event/EventTest"
        xmlns="http://www.w3.org/2001/XMLSchema">
        <element name="process">
                <complexType>
                        <sequence>
                                <element name="payload" type="string"
                                  maxOccurs="unbounded"/>
                        </sequence>
                </complexType>
        </element>
        <element name="processResponse">
                <complexType>
                        <sequence>
                                <element name="payload" type="string"
                                   maxOccurs="unbounded"/>
                        </sequence>
                </complexType>
        </element>
</schema> 

from変数には、次の例に示すコンテンツが含まれています。

<ns1:process xmlns:ns1="http://xmlns.oracle.com/Event_jws/Event/EventTest">
            <ns1: payload >a</ns1: payload >
            <ns1: payload >b</ns1: payload >
</ns1:process> 

to変数には、次の例に示すコンテンツが含まれています。

<ns1:processResponse xmlns:ns1="http://xmlns.oracle.com/Event_
 jws/Event/EventTest">
            <ns1: payload >c</ns1: payload >
</ns1:process>

bpelx:copyList操作は、次の例のようになります。

<assign>
      <bpelx:copyList>
        <bpelx:from variable="inputVariable" part="payload"
              query="/client:process/client:payload"/>
        <bpelx:to variable="outputVariable" part="payload"
            query="/client:processResponse/client:payload"/>
      </bpelx:copyList>
</assign>

これによって、次の例のようにto変数が定義されます。

<ns1:processResponse xmlns:ns1="http://xmlns.oracle.com/Event_
 jws/Event/EventTest">
            <ns1: payload >a</ns1: payload >
            <ns1: payload >b</ns1: payload >
</ns1:process> 

6.16.6.2 BPEL 2.0のbpelx:copyList

次に、BPELバージョン2.0をサポートするBPELプロジェクトのbpelx:copyList構文の例を示します。BPEL 2.0では、この機能は「BPEL 1.1のbpelx:copyList」で説明されている機能と同じですが、構文が多少異なります。extensionAssignOperation要素はbpelx:copyList拡張要素をラップします。

<assign>
   <extensionAssignOperation>
      <bpelx:copyList>
         <bpelx:from>$inputVariable.payload/client:payload</bpelx:from>
         <bpelx:to>$outputVariable.payload/client:payload</bpelx:to>
      </bpelx:copyList>
   </extensionAssignOperation>
</assign>

6.16.7 assign拡張要素の属性の使用方法

次の属性をassignアクティビティのコピー・ルールに割り当てることができます。

  • ignoreMissingFromData

  • insertMissingToData

  • keepSrcElementName

assignアクティビティの「コピー・ルール」タブの下部で、選択したコピー・ルールを右クリックして、適切な属性を選択するためのメニューを表示します。図6-35に詳細を示します。

図6-35 assign拡張要素の属性

図6-35の説明が続きます
「図6-35 assign拡張要素の属性」の説明

6.16.7.1 ignoreMissingFromData属性

ignoreMissingFromData属性は、bpel:selectionFailure標準フォルトを抑止します。表6-3に、BPELバージョン1.1とバージョン2.0の構文の違いを示します。


表6-3 ignoreMissingFromData属性の構文

BPEL 1.1 BPEL 2.0
<copy bpelx:ignoreMissingFromData="yes|no"/>
<copy ignoreMissingFromData="yes|no"/>

6.16.7.2 insertMissingToData属性

insertMissingToData属性は、項目が選択されなかった場合、to-specで指定された(XPath) L-valueを実行するようにランタイムに指示します。表6-4に、BPELバージョン1.1とバージョン2.0の構文の違いを示します。


表6-4 insertMissingToData属性の構文

BPEL 1.1 BPEL 2.0
<copy bpelx:insertMissingToData="yes|no"/>
<copy bpelx:insertMissingToData="yes|no"/>

6.16.7.3 keepSrcElementName属性

keepSrcElementName属性を使用すると、(to-specの選択に従って)宛先の要素名をソースの要素名に置換できます。この属性は、BPEL 1.1では実装されていませんでした。表6-5に、BPELバージョン2.0でサポートされている構文を示します。


表6-5 keepSrcElementName属性の構文

BPEL 1.1 BPEL 2.0

未実装

<copy keepSrcElementName="yes|no"/>

6.17 XMLデータの検証

コードを検証してBPELプロジェクト内の無効なXMLデータを識別できます。

6.17.1 BPEL 2.0のXMLデータの検証方法

この項では、BPEL 2.0のXMLデータの検証について説明します。

6.17.1.1 assignアクティビティでのXMLの検証

Oracle BPELデザイナ内のassignアクティビティで、次の手順を実行します。

  1. 「コンポーネント」ウィンドウの「BPELコンストラクト」セクションから、デザイナにassignアクティビティをドラッグします。

  2. assignアクティビティをダブルクリックします。

  3. 「一般」タブで、アクティビティの名前を入力し、「検証」チェック・ボックスを選択します。

  4. 「適用」をクリックし、「OK」をクリックします。

  5. 「ソース」タブをクリックして構文を表示します。assignアクティビティを使用してXMLデータを検証するための構文は、BPELバージョン1.1とバージョン2.0では多少異なります。

    <assign name="Assign1" validate="yes">
     . . .
    </assign>
    

6.17.1.2 スタンドアロン、拡張validateアクティビティでのXMLの検証

Oracle BPELデザイナ内のスタンドアロン(assignアクティビティなしで使用可能な拡張validateアクティビティ)で、次の手順を実行します。

  1. 「コンポーネント」ウィンドウの「BPELコンストラクト」セクションから、デザイナにvalidateアクティビティをドラッグします。

  2. 「検証」アイコンをダブルクリックします。

  3. アクティビティの名前を入力します。

  4. 「追加」アイコンをクリックして、検証する変数を選択します。

  5. 変数を選択し、「OK」をクリックします。

  6. 「適用」をクリックし、「OK」をクリックします。

  7. 「ソース」タブをクリックして構文を表示します。validateアクティビティを使用してXMLデータを検証するための構文は、BPELバージョン1.1とバージョン2.0では多少異なります。

    <validate name="Validate1" variables="inputVariable"/>

6.17.2 BPEL 1.1のXMLデータの検証方法

この項では、BPEL 1.1のXMLデータの検証について説明します。

6.17.2.1 assignアクティビティでのXMLの検証

Oracle BPELデザイナ内のassignアクティビティで、次の手順を実行します。

  1. 「コンポーネント」ウィンドウの「BPELコンストラクト」セクションから、デザイナにassignアクティビティをドラッグします。

  2. assignアクティビティをダブルクリックします。

  3. 「一般」タブで、アクティビティの名前を入力し、「検証」チェック・ボックスを選択します。

  4. 「適用」をクリックし、「OK」をクリックします。

  5. 「ソース」タブをクリックして構文を表示します。

    <assign name=Assign1" bpelx:validate="yes"
      . . .  
    </assign>
    

6.17.2.2 スタンドアロン、拡張validateアクティビティでのXMLの検証

Oracle BPELデザイナ内のスタンドアロン(assignアクティビティなしで使用可能な拡張validateアクティビティ)で、次の手順を実行します。

  1. 「コンポーネント」ウィンドウの「Oracle Extensions」セクションから、デザイナにvalidateアクティビティをドラッグします。

  2. 「検証」アイコンをダブルクリックします。

  3. アクティビティの名前を入力します。

  4. 「追加」アイコンをクリックして、検証する変数を選択します。

  5. 変数を選択し、「OK」をクリックします。

  6. 「適用」をクリックし、「OK」をクリックします。

  7. 「ソース」タブをクリックして構文を表示します。

    <bpelx:validate name=Validate1" variables="inputVariable"/>

6.18 BPEL 2.0のメッセージ交換アクティビティでの要素変数の使用

次のメッセージ交換アクティビティで変数を指定できます。

  • 「Invoke」ダイアログの(inputVariable属性の)「入力」フィールドと(outputVariable属性の)「出力」フィールド

  • receiveアクティビティの(variable属性の)「入力」フィールド

  • replyアクティビティの(variable属性の)「出力」フィールド

これらのフィールドで参照される変数は通常、QNameが操作で使用される入力および出力メッセージ・タイプと一致するメッセージ・タイプ変数である必要があります。

例外は、アクティビティのWSDL操作が、要素を使用して定義された1つのパートを含むメッセージを使用している場合です。この場合、パートの定義に使用される同じ要素タイプの変数はそれぞれ、invokeアクティビティのinputVariable属性とoutputVariable属性、またはreceiveアクティビティまたはreplyアクティビティのvariable属性で参照できます。

この状況で変数を使用するのは、関連するWSDLメッセージ・タイプに基づいて匿名の一時WSDLメッセージ変数を宣言するのと同じである必要があります。

匿名の一時WSDLメッセージ変数と要素変数の間で要素データをコピーするのは、keepSrcElementName属性がyesに設定された1回のコピー操作による単一の仮想assignアクティビティとして機能します。仮想割当ては、実際のassignアクティビティと同じルールに従い、同じフォルトを使用する必要があります。表6-6に詳細を示します。


表6-6 WSDLメッセージ・パートのマップ

対象 説明

inputVariable属性

属性で参照される変数の値により、匿名の一時WSDLメッセージ変数のパートの値が設定されます。

outputVariable属性

一時WSDLメッセージ変数の受信したパートの値により、属性で参照される変数の値が設定されます。

receiveアクティビティ

着信パートの値により、variable属性で参照される変数の値が設定されます。

replyアクティビティ

variable属性で参照される変数の値により、送信される匿名の一時WSDLメッセージ変数のパートの値が設定されます。フォルトを送信するreplyアクティビティの場合も、同じシナリオが適用されます。


keepSrcElementName属性の詳細は、「keepSrcElementName属性」を参照してください。

6.19 BPEL 2.0でのWSDLメッセージ・パートのマップ

invokeアクティビティおよびreplyアクティビティの「引数マッピング」セクションは、BPEL変数のコンテンツから明示的に作成されるマルチパートWSDLメッセージの代替手段を提供します。

「引数マッピング」セクションを使用する場合、該当するWSDL操作の入力メッセージで指定されたタイプに基づいて、匿名の一時WSDL変数が定義されます。

WSDLメッセージ・パートのマッピングの詳細は、次のURLにあるを参照してください。

http://www.oasis-open.org

6.19.1 WSDLメッセージ・パートのマップ方法

「引数マッピング」表には、選択した操作のパートが含まれています。この表の「値」列を編集することで、各メッセージ・パートの値を設定できます。値を取得して、メッセージ・パートを格納する変数を選択します。

BPEL 2.0でのWSDLメッセージ・パートをマップする手順は、次のとおりです。

  1. 図6-36のreceiveアクティビティには、クライアントからの標準のinputVariable変数が含まれていることに注意してください。

    図6-36 receiveアクティビティ

    図6-36の説明が続きます
    「図6-36 receiveアクティビティ」の説明
  2. 図6-37のreplyアクティビティの下部にある「引数マッピング」ボタンに注意してください。表のエントリをクリックすることで、各メッセージ・パートの値を設定できます。

    図6-37 replyアクティビティの下部に定義されている「引数マッピング」セクション

    図6-37の説明が続きます
    「図6-37 replyアクティビティの下部に定義されている「引数マッピング」セクション」の説明

6.20 BPEL 2.0でのプロセス定義のインポート

import要素を使用して、BPELプロセスが依存する定義を指定できます。次の例に示すように、バージョン2.0のBPELプロセスを作成すると、import要素が.bpelファイルに追加されます。

<process name="Loan Flow"
   . . .
   . . .
   <import namespace="http://xmlns.oracle.com/SOAApplication/SOAProject/LoanFlow"
     location="LoanFlow.wsdl" importType="http://schemas.xmlsoap.org/wsdl/"/> 

次の例に示すように、import要素を使用して、ネームスペースのないスキーマをインポートすることもできます。

<process name="Loan Flow"
   . . .
   . . .
<import location="xsd/NoNamespaceSchema.xsd"
 importType="http://www.w3.org/2001/XMLSchema"/>

次の例に示すように、import要素を使用して、ネームスペースを持つスキーマをインポートすることもできます。

<process name="Loan Flow"
   . . .
   . . .
<import namespace="http://www.example.org" location="xsd/TestSchema.xsd"
 importType="http://www.w3.org/2001/XMLSchema"/>

import要素は、外部XMLスキーマまたはWSDL定義に対する依存性を宣言するために用意されています。任意の数のimport要素をprocess要素の子として表示できます。各import要素には次の属性を含めることができます。

  • namespace: インポートされた定義を指定する絶対URIを識別します。これはオプションの属性です。ネームスペースが指定されている場合、インポートされた定義はそのネームスペースに含まれている必要があります。ネームスペースが指定されていない場合、これはネームスペースで修飾されていない外部定義が使用中であることを示します。インポートされた定義にtargetNamespaceの指定を含めないでください。

  • location: 重要な定義を含むドキュメントの場所を指定するURIを識別します。これはオプションの属性です。相対URIを指定できます。location属性が指定されていない場合、プロセスでは外部定義が使用されます。ただし、これらの定義の配置先を示す文は指定されません。

  • importType: インポートするドキュメントのタイプを識別します。これは、ドキュメントで使用されるエンコーディング言語を指定する絶対URIである必要があります。これは必須属性です。

    • XMLスキーマ1.0ドキュメントをインポートする場合は、この属性の値を"http://www.w3.org/2001/XMLSchema"に設定する必要があります。

    • WSDL 1.1ドキュメントをインポートする場合は、値を"http://schemas.xmlsoap.org/wsdl/"に設定する必要があります。この属性に他の値を指定することもできます。

詳細は、の第5.4項を参照してください。

6.21 配列に類似したXMLデータ・シーケンスの操作

データ・シーケンスは、XMLで使用される最も基本的なデータ・モデルの1つです。しかし、データ・シーケンスの操作が重要な場合があります。BPELプロセス・サービス・コンポーネントで使用される最も一般的なデータ・シーケンス・パターンの1つが配列です。XMLスキーマに基づき、データ・シーケンス定義はその属性maxOccursから識別できます。この属性が、1より大きい値に設定されているか、unboundedとしてマークされています。詳細は、http://www.w3.org/TRXML Schema Specificationを参照してください。

この項の例では、BPELのデータ・シーケンスを操作するいくつかの基本的な方法を示します。ただし、ループの実行、エンドポイントの動的参照など、関連するその他の要件が存在します。次の項では、データ・シーケンス操作の特定の要件について説明します。

6.21.1 配列を使用するXMLデータ・シーケンスへの静的な索引付け方法

必要な要素索引が設計時にわかっているとき、XPath機能を使用してデータ・シーケンス要素を選択する方法を次の2つの例で示します。これらのケースでは、最初の要素です。

次の例では、addresses[1]はaddressesデータ・シーケンスの最初の要素を選択します。

<assign>
   <!-- get the first address and assign to variable address -->
   <copy>
      <from variable="input" part="payload"
         query="/tns:invalidLoanApplication/autoloan:application
                /autoloan:customer/autoloan:addresses[1]"/>
      <to variable="address"/>
   </copy>
</assign>

この問合せで、addresses[1]addresses[position()=1]と等価で、positionはコアXPath関数の1つです(の第2.4項と第4.1項を参照)。次の例の問合せでは、position関数を明示的にコールして、アドレスのデータ・シーケンスの最初の要素を選択します。次に、そのアドレスのstreet要素(アクティビティで変数street1に割り当てられます)を選択します。

<assign>
   <!-- get the first address's street and assign to street1 -->
   <copy>
      <from variable="input" part="payload"
         query="/tns:invalidLoanApplication/autoloan:application
                /autoloan:customer/autoloan:addresses[position()=1]
                /autoloan:street"/>
      <to variable="street1"/>
   </copy>
</assign>

WSDLファイルで入力変数の定義とそのペイロード・パートを確認する際、addressesフィールドの定義に到達するまでに、いくつかのレベルを下っていきます。そこで、maxOccurs="unbounded"属性が見つかります。2つのXPath索引付けメソッドは機能的には同じであり、どちらを使用してもかまいません。

6.21.2 SOAPでエンコードされた配列の使用方法

Oracle SOA Suiteでは、SOAP RPCでエンコードされた配列をサポートしています。このサポートにより、Oracle BPEL Process Managerは、SOAP 1.1配列を使用するSOAP Webサービス(RPCでエンコードされた)をコールするクライアントとして機能できます。

次の例に、myFavoriteNumbersというSOAP配列ペイロードの例を示します。

<myFavoriteNumbers SOAP-ENC:arrayType="xsd:int2">
<number>3</number>
<number>4</number>
</myFavoriteNumbers>

また、スキーマの要素の属性attributeFormDefaultおよびelementFormDefault"unqualified"に設定されていることを確認してください。次の例に詳細を示します。

attributeFormDefault="unqualified" elementFormDefault="unqualified"
targetNamespace="java:services" xmlns:s0="http://schemas.xmlsoap.org/wsdl/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

次の機能はサポートされていません。

  • SOAP配列を使用するBPELによって公開されるサービス

  • 部分的に送信される配列

  • スパース配列

  • 多次元配列

SOAPでエンコードされた配列を使用する手順は、次のとおりです。

次の例に、BPELプロジェクトにbpelx:appendタグの付いたSOAP配列を準備する方法を示します。

  1. Oracle JDeveloperでBPELプロセスを作成します。

  2. 起動用のぺイロードを準備します。bpelx:appendは、項目をSOAP配列に追加するために使用されることに注意してください。

    <bpws:assign> 
       <bpws:copy>
          <bpws:from variable="input" part="payload" query="/tns:value"/>
          <bpws:to variable="request" part="strArray"
          query="/strArray/JavaLangstring"/>
       </bpws:copy>
    </bpws:assign>
    <bpws:assign>
       <bpelx:append>
       <bpelx:from variable="request" part="strArray"
       query="/strArray/JavaLangstring1"/>
       <bpelx:to variable="request" part="strArray" query="/strArray"/>
       </bpelx:append>
    </bpws:assign>
    
  3. 次のネームスペースをWSDLファイルにインポートします。WSDLスキーマ要素にインポート文が欠落している場合、Oracle JDeveloperではSOAP-ENCタグを認識しません。

    <xs:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />

6.21.2.1 BPEL 2.0のSOAPでエンコードされた配列

SOAPでエンコードされた配列は、BPEL仕様のバージョン2.0を使用するBPELプロジェクトでサポートされています。次の例に、BPEL 2.0プロジェクトのSOAPでエンコードされた配列を持つassignアクティビティのサンプルを示します。

<assign name="Assign_1">
   <copy>
      <from>$inputVariable.payload</from>
      <to>$Invoke_1_echoArray_InputVariable.strArray/JavaLangstring[1]</to>
   </copy>
   <extensionAssignOperation>
      <bpelx:append>
         <bpelx:from variable="Invoke_1_echoArray_InputVariable"
            part="strArray">
            <bpelx:query>
               JavaLangstring[1]
            </bpelx:query>
         </bpelx:from>
         <bpelx:to variable="Invoke_1_echoArray_InputVariable"
            part="strArray">
         </bpelx:to>
         </bpelx:append>
    </extensionAssignOperation>
   </assign>

次の例に、BPEL 2.0プロジェクトのSOAPでエンコードされた配列を持つinvokeアクティビティのサンプルを示します。

<invoke name="Invoke1" partnerLink="FileOut"
   portType="ns3:Write_ptt" operation="Write"
   bpelx:invokeAsDetail="no">
   <toParts>
      <toPart part="body" fromVariable="ArrayVariable"/>
   </toParts>
</invoke>

6.21.2.2 スキーマ内でwsdl:arrayType属性を使用したSOAP配列の宣言

SOAPでエンコードされた配列のWSDLでは、スキーマ内でwsdl:arrayType属性を使用してSOAP配列を宣言できます。次の例に詳細を示します。

<xsd:complexType name="UserObject">
    <xsd:sequence>
        <xsd:element name="userInformation" nillable="true"
          type="n5:ArrayOfKeyValuePair"/>
        <xsd:element name="username" nillable="true" type="xsd:string"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="ArrayOfKeyValuePair">
    <xsd:complexContent>
        <xsd:restriction base="soapenc:Array">
            <xsd:attribute ref="soapenc:arrayType"
             wsdl:arrayType="n5:KeyValuePair[]"/>
        </xsd:restriction>
    </xsd:complexContent>
</xsd:complexType>
   
<xsd:complexType name="KeyValuePair">
    <xsd:sequence>
        <xsd:element name="key" nillable="true" type="xsd:string"/>
        <xsd:element name="value" nillable="true" type="xsd:string"/>
    </xsd:sequence>
</xsd:complexType>

次の例に、BPEL 1.1でSOAPでエンコードされた配列を作成してアクセスする方法を示します。

<bpws:copy>
    <bpws:from>
       <ns1:userInformation soapenc:arrayType="com1:KeyValuePair[1]"
       xmlns:ns1="http://www.schematargetnamespace.com/wsdl/Impl/"
         xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"/>
         <ns1:KeyValuePair
            xmlns:ns1="http://www.schematargetnamespace.com/wsdl/Impl/">
            <key>testkey</key>
            <value>testval1</value>
          </ns1:KeyValuePair>
       </ns1:userInformation>
    </bpws:from>
    <bpws:to variable="Inputvar" part="userObject"
             query="/userObject/userInformation"/>

</bpws:copy>
<!--Update elements with SOAPENC Array-->
<bpws:copy>
    <bpws:from variable="KeyValueVar" part="KeyValuePair"
                query="/KeyValuePair/ns2:key"/>
    <bpws:to variable="Inputvar" part="userObject'
 query="//*[local-name()='KeyValuePair'][1]/*[local-name()='key']"/>
</bpws:copy>

<bpws:copy>
    <bpws:from variable="KeyValueVar" part="KeyValuePair"
                query="/KeyValuePair/client:value"/>
    <bpws:to variable="Inputvar" part="userObject"
   query="//*[local-name()='KeyValuePair'][1]/*[local-name()='value']"/>

</bpws:copy>
<!-- Append elements within SOAPENC Array -->
<bpelx:append>
    <bpelx:from variable="Inputvar" part="userObject"
                query="//*[local-name()='KeyValuePair'][1]"/>
    <bpelx:to variable="Inputvar" part="userObject"
              query="/userObject/userInformation"/>
</bpelx:append>

6.21.3 シーケンス・サイズの決定方法

データ・シーケンスの実行時のサイズ、つまりシーケンス内のノードまたはデータ項目の数を知る必要がある場合は、XPath組込み関数count()とBPEL組込み関数getVariableData()を組み合せて使用することで取得できます。

次の例のコードは、itemシーケンス内の要素数を計算し、それを整数変数lineItemSizeに割り当てています。

<assign>
   <copy>
      <from expression="count(bpws:getVariableData('outpoint', 'payload',
                        '/p:invoice/p:lineItems/p:item')"/>
      <to variable="lineItemSize"/>
   </copy>
</assign>

6.21.4 式の末尾へのXPathの適用による動的な索引付け方法

多くの場合、データ・シーケンスへの索引付けに動的な値が必要になることがあります。つまり、シーケンスのn番目のノード(nの値は実行時に定義)の取得が必要な場合です。この項では、式の末尾にXPathを適用して動的な索引付けを行う方法について説明します。

6.21.4.1 getVariableDataの結果の末尾へのXPathの適用

次の例に示す動的索引付けメソッドでは、XPathをbpws:getVariableData()の最後の引数として使用するのではなく、bwps:getVariableData()の結果の末尾にXPathを適用します。末尾のXPathは、位置述語内の整数型の索引変数(つまり、[...])を参照します。

<variable name="idx" type="xsd:integer"/>
...
<assign>
  <copy>
    <from expression="bpws:getVariableData('input','payload'
       )/p:line-item[bpws:getVariableData('idx')]/p:line-total" />
    <to variable="lineTotalVar" />
  </copy>
</assign> 

実行時に、idx整数変数の値として2が格納されるとします。前述の例のfrom内の式は、次の例の式と同等です。

<from expression="bpws:getVariableData('input','payload'
       )/p:line-item[2]/p:line-total" />

XPathがbwps:getVariableData()関数の末尾に使用される場合とこの関数内で使用される場合では、XPathの使用方法に多少の違いがあります。同じ例(payloadが要素p:invoiceのメッセージ・パートである例)を使用すると、XPathをgetVariableData()関数内で使用する場合は、ルート要素名(/p:invoice)をXPathの先頭に指定する必要があります。

次の例に詳細を示します。

bpws:getVariableData('input', 'payload','/p:invoice/p:line-item[2]/p:line-total')

XPathをbwps:getVariableData()関数の末尾に使用する場合、ルート要素名をXPath内に指定する必要はありません。

次に例を示します。

bpws:getVariableData('input', 'payload')/p:line-item[2]/p:line-total

これは、getVariableData()関数で返されるノードがルート要素であるためです。ルート要素名をXPathで再指定すると重複になり、XPathの標準セマンティクスでは不正となります。

6.21.4.2 bpelx:append拡張要素によるシーケンスへの新しい項目の追加

assignアクティビティでbpelx:append拡張要素を使用すると、BPELプロセス・サービス・コンポーネントは既存の親要素に新しい要素を追加できます。次に例を示します。

    <assign name="assign-3">
        <copy>
            <from expression="bpws:getVariableData('idx')+1" />
            <to variable="idx"/>
        </copy>
        <bpelx:append>
            <bpelx:from variable="partInfoResultVar" part="payload" />
            <bpelx:to variable="output" part="payload" />
        </bpelx:append>
        ...
    </assign>

この例のbpelx:appendロジックにより、partInfoResultVar変数のペイロード要素が、output変数のペイロード要素に子として追加されます。つまり、output変数のペイロード要素が親要素として使用されます。

6.21.4.3 データ・シーケンスのマージ

2つのシーケンスを単一のデータ・シーケンスにマージできます。このパターンは、データ・シーケンスが配列内にある場合(つまり、互換性のあるタイプのデータ項目のシーケンスの場合)によく使用されます。次に示すassignの下の2つのappend操作は、データ・シーケンスのマージ方法を示しています。

<assign>
    <!-- initialize "mergedLineItems" variable
         to an empty element -->
    <copy>
        <from> <p:lineItems /> </from>
        <to variable="mergedLineItems" />
    </copy>
    <bpelx:append>
          <bpelx:from variable="input" part="payload"
                query="/p:invoice/p:lineItems/p:lineitem" />
          <bpelx:to variable="mergedLineItems" />
    </bpelx:append>
    <bpelx:append>
          <bpelx:from variable="literalLineItems"
                query="/p:lineItems/p:lineitem" />
          <bpelx:to variable="mergedLineItems" />
    </bpelx:append>
</assign>

6.21.4.4 空要素の配列と等価の機能の生成

genEmptyElem関数では、空要素の配列と等価の機能がXML構造に生成されます。この関数は、次の引数をとります。

genEmptyElem('ElemQName',int?, 'TypeQName'?, boolean?)

次の点に注意してください。

  • 最初の引数では、空要素のQNameを指定します。

  • 2番目の引数はオプションで整数型であり、空要素の数を指定します。指定されていない場合、デフォルトのサイズは1です。

  • 3番目の引数はオプションで、生成される空の名前のxsi:typeとなるQNameを指定します。このxsi:typeパターンは、SOAPENC:Arrayに相当します。指定されていないか、空の文字列である場合、xsi:type属性は生成されません。

  • 4番目のオプションのブール型引数は、要素がXSD-nillableの場合に、生成される空の要素がXSI - nilかどうかを指定します。デフォルト値はfalseです。指定されていないか、falseである場合、xsi:nilは生成されません。

次の例に、poの下で10個の空の<lineItem>要素を使用して発注書(PO)を初期化するappend文を示します。

<bpelx:assign> 
    <bpelx:append>
        <bpelx:from expression="ora:genEmptyElem('p:lineItem',10)" />
        <bpelx:to variable="poVar" query="/p:po" /> 
    </bpelx:append>
</bpelx:assign>

前述の例のgenEmptyElem関数は、次の例のように埋込みXQuery式で置き換えることができます。

ora:genEmptyElem('p:lineItem',10) 
== for $i in (1 to 10) return <p:lineItem />

この関数により生成される空要素は、通常は無効なXMLデータです。空要素の作成後に、さらにデータの初期化を実行します。前述と同じ例を使用して、次の操作を実行できます。

  • 空のlineItem要素に属性要素と子要素を追加します。

  • copy操作を実行して空要素を置き換えます。たとえば、flowNアクティビティの下で、この等価配列内の個別エントリにWebサービスの結果からコピーします。

6.21.5 配列識別子の使用に関する必知事項

ネイティブ・フォーマット・ビルダー配列識別子環境での処理には、ノードの親ノードに関する情報が必要です。reportSAXEvents APIが使用されるため、通常、この情報はアウトバウンド・メッセージ・シナリオには使用できません。ネイティブ・スキーマのnxsd:useArrayIdentifierstrueに設定することで、アウトバウンド・メッセージ・シナリオにDOM解析を使用できるようになります。大規模なペイロードによりパフォーマンスの低下につながる可能性があるため、この設定には注意が必要です。次の例に詳細を示します。

<?xml version="1.0" ?> 

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            xmlns:nxsd="http://xmlns.oracle.com/pcbpel/nxsd" 
            targetNamespace="http://xmlns.oracle.com/pcbpel/demoSchema/csv" 
            xmlns:tns="http://xmlns.oracle.com/pcbpel/demoSchema/csv" 
            elementFormDefault="qualified" 
            attributeFormDefault="unqualified" nxsd:encoding="US-ASCII"   
nxsd:stream="chars" nxsd:version="NXSD" nxsd:useArrayIdentifiers="true"> 
  <xsd:element name="Root-Element"> 
  .... 
  </xsd:element> 
</xsd:schema> 

6.22 文字列からのXML要素への変換

サービスは文字列を返すように定義されることがありますが、文字列の内容は実際にはXMLデータです。問題は、BPELではXMLデータの操作(XPath問合せや式などを使用)はサポートされていますが、変数またはフィールドが文字列型の場合にこの機能が使用できないことです。Javaでは、DOM関数を使用して文字列を構造化されたXMLオブジェクト・タイプに変換します。同じことが、BPEL XPath関数parseEscapedXMLを使用して実行できます。

parseEscapedXMLの詳細は、「parseEscapedXML」を参照してください。

6.22.1 文字列からXML要素への変換方法

parseEscapedXML関数はXMLデータを受け取り、DOMによって解析し、型指定されたBPEL変数に割当て可能な構造化XMLデータを返します。次に例を示します。

<!-- execute the XPath extension function
parseEscapedXML('&lt;item&gt;') and assign to a variable
-->
<assign>
   <copy>
      <from expression="oratext:parseEscapedXML(
         '&lt;item xmlns=&quot;http://samples.otn.com&quot;
                   sku=&quot;006&quot;&gt;
          &lt;description&gt;sun ultra sparc VI server
          &lt;/description&gt;
          &lt;price&gt;1000
          &lt;/price&gt;
          &lt;quantity&gt;2
          &lt;/quantity&gt;
          &lt;lineTotal&gt;2000
          &lt;/lineTotal&gt;
          &lt;/item&gt;')"/>
      <to variable="escapedLineItem"/>
   </copy>
</assign>

6.23 ドキュメント形式とRPC形式のWSDLの違いの理解

この章のこれまでの項で示した例は、次の例のように、メッセージがXMLスキーマのelementで定義されているドキュメント形式のWSDLファイルでした。

<message name="LoanFlowRequestMessage">
<part name="payload" element="s1:loanApplication"/>
</message>

これは、次の例に示すように、メッセージがXMLスキーマのtypeで定義される、RPC形式のWSDLファイルとは異なります。

<message name="LoanFlowRequestMessage">
<part name="payload" type="s1:LoanApplicationType"/>
</message>

6.23.1 RPC形式ファイルの使用方法

これは、この章のこれまでの情報とは異なります。これらの2つのWSDLメッセージ形式では、XPath問合せの作成方法に相違があります。RPC形式のメッセージの場合、最上位要素(およびXPath問合せ文字列の最初のノード)はパート名(前述の例ではpayload)です。ドキュメント形式メッセージでは、最上位ノードは要素名(たとえばloanApplication)です。

次の例(WSDLファイルおよびBPELファイル)に、LoanServicesという名前のアプリケーションがRPC形式の場合のXPath問合せ文字列を示します。

<message name="LoanServiceResultMessage">
   <part name="payload" type="s1:LoanOfferType"/>
</message>

<complexType name="LoanOfferType">
   <sequence>
      <element name="providerName" type="string"/>
      <element name="selected" type="boolean"/>
      <element name="approved" type="boolean"/>
      <element name="APR" type="double"/>
   </sequence>
</complexType>
<variable name="output"
          messageType="tns:LoanServiceResultMessage"/>
...
<assign>
   <copy>
      <from expression="9.9"/>
      <to variable="output" part="payload" query="/payload/APR"/>
   </copy>
</assign>

6.24 BPELでのSOAPヘッダーの操作

BPELの通信アクティビティ(invoke、receive、replyおよびonMessage)は、指定のメッセージ変数を介してメッセージを送受信します。これらのデフォルト・アクティビティでは、各方向で1つの変数の操作が許可されます。たとえば、invokeアクティビティにはinputVariableおよびoutputVariable属性があります。この2つの属性にそれぞれ変数を1つ指定できます。関連する特定の操作で使用するペイロード・メッセージが各方向で1つのみの場合は、これで十分です。

ただし、WSDLは1つの操作での複数のメッセージをサポートしています。SOAPの場合、SOAPヘッダーとしてメイン・ペイロード・メッセージとともに複数のメッセージを送信できます。ただし、BPELのデフォルトの通信アクティビティは、追加のヘッダー・メッセージに対応できません。

Oracle BPEL Process Managerでは、デフォルトのBPEL通信アクティビティをbpelx:headerVariable拡張要素で拡張することで、この問題を解決しています。次の例に、拡張要素の構文を示します。

<invoke bpelx:inputHeaderVariable="inHeader1 inHeader2 ..."
  bpelx:outputHeaderVariable="outHeader1 outHeader2 ..."
  .../>

<receive bpelx:headerVariable="inHeader1 inHeader2 ..." .../>
<onMessage bpelx:headerVariable="inHeader1 inHeader2 ..." .../>
<reply bpelx:headerVariable="inHeader1 inHeader2 ..." .../>

6.24.1 BPELでのSOAPヘッダーの受信方法

この項では、SOAPヘッダーを受信するBPELファイルとWSDLファイルの作成方法を、例をあげて説明します。

BPELでSOAPヘッダーを受信する手順は、次のとおりです。

  1. ヘッダー・メッセージとそれをSOAPリクエストにバインドするSOAPバインディングを宣言するWSDLファイルを作成します。次に例を示します。
      <!-- custom header -->
      <message name="CustomHeaderMessage">
        <part name="header1" element="tns:header1"/>
        <part name="header2" element="tns:header2"/>
      </message>
    
      <binding name="HeaderServiceBinding" type="tns:HeaderService">
        <soap:binding style="document"
          transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="initiate">
          <soap:operation style="document" soapAction="initiate"/>
            <input>
              <soap:header message="tns:CustomHeaderMessage"
                part="header1" use="literal"/>
              <soap:header message="tns:CustomHeaderMessage"
                part="header2" use="literal"/>
              <soap:body use="literal"/>
            </input>
        </operation>
      </binding>
    
  2. 次の例に示すように、ヘッダー・メッセージ変数を宣言し、bpelx:headerVariableを使用してヘッダーを受信するBPELソース・ファイルを作成します。
    <variables>  <variable name="input"
                 messageType="tns:HeaderServiceRequestMessage"/>
      <variable name="event"
                 messageType="tns:HeaderServiceEventMessage"/>
      <variable name="output"
                 messageType="tns:HeaderServiceResultMessage"/>
      <variable name="customHeader"
                 messageType="tns:CustomHeaderMessage"/>
    </variables>
    
    <sequence>
      <!-- receive input from requester -->
      <receive name="receiveInput" partnerLink="client" 
        portType="tns:HeaderService" operation="initiate" 
        variable="input"
        bpelx:headerVariable="customHeader"
     createInstance="yes"/>

6.24.2 BPELでのSOAPヘッダーの送信方法

この項では、SOAPヘッダーの送信方法を例をあげて説明します。

BPELでSOAPヘッダーを送信する手順は、次のとおりです。

  1. composite.xmlファイルで参照を定義して、HeaderServiceを参照します。
  2. 次の例に示すように、カスタム・ヘッダー変数を定義して操作し、bpelx:inputHeaderVariableを使用して送信します。
    <variables>
      <variable name="input" messageType="tns:HeaderTestRequestMessage"/>
      <variable name="output" messageType="tns:HeaderTestResultMessage"/>
      <variable name="request" messageType="services:HeaderServiceRequestMessage"/>
      <variable name="response" messageType="services:HeaderServiceResultMessage"/>
      <variable name="customHeader"messageType="services:CustomHeaderMessage"/>
        </variables>
    ...
    <!-- initiate the remote process -->
      <invoke name="invokeAsyncService"
        partnerLink="HeaderService"
        portType="services:HeaderService" 
        bpelx:inputHeaderVariable="customHeader"
        operation="initiate"
        inputVariable="request"/>

6.25 BPEL 2.0での拡張ネームスペースの宣言

BPELバージョン2.0のプロセスを拡張して、カスタム拡張ネームスペース宣言を追加できます。mustUnderstand属性を使用すると、カスタム・ネームスペースがBPELプロセスで認識される必要があるセマンティックを持つかどうかを示すことができます。

mustUnderstandyesに設定された1つ以上の拡張機能がBPELプロセスでサポートされていない場合、プロセス定義は拒否されます。

拡張機能はextensions要素に定義されます。次の例に詳細を示します。

<process ...>
  ...
  <extensions>?
    <extension namespace="myURI" mustUnderstand="yes|no" />+
  </extensions>
...
</process>

extension要素のコンテンツは、標準のBPELネームスペースとは異なるネームスペースで修飾された1つの要素である必要があります。

拡張宣言の詳細は、次のURLにあるを参照してください。

http://www.oasis-open.org

6.25.1 拡張ネームスペースの宣言方法

拡張ネームスペースを宣言する手順は、次のとおりです。

  1. BPEL 2.0プロセスで、Oracle BPELデザイナの上にある「拡張機能」アイコンをクリックします。

    「拡張機能」ダイアログが表示されます。

  2. 「拡張機能」フォルダを選択し、「追加」アイコンをクリックします。

    「拡張機能」ダイアログが表示されます。

  3. 「ネームスペース」フィールドに、宣言する拡張ネームスペースを入力します。このネームスペースは、標準のBPELネームスペースとは異なるものにする必要があります。
  4. 拡張機能がBPELプロセスで認識されるようにするには、「認識する必要がある」チェック・ボックスを選択します。
  5. 「OK」をクリックします。
  6. 「閉じる」をクリックします。

6.25.2 拡張機能作成時の処理内容

設計の完了後、.bpelプロセスは次の例のようになります。

<extensions>
   <extension namespace="http://xmlns.mycompany.com/myNamespace"
    mustUnderstand="yes"/>
</extensions>