トランスフォーメーションは、ソース・スキーマの要素をターゲット・スキーマの要素にマップします。通常、Webサービスによって受信データに必要な書式(請求の書式など)が指定されるため、ソース・データ・スキーマ(発注など)をターゲット・データ・スキーマにマップするためのトランスフォーメーションが必要です。
transformアクティビティを使用して、トランスフォーメーション・ロジックをBPELプロセスに追加します。トランスフォーメーションでは、ソース変数とターゲット変数、マップするメッセージ部分およびXSLマップ・ファイルを定義します。図7-12に示すように、ソースおよびターゲット・スキーマのマッピングを指定するには、XSLTマッパーを使用します。
XSLマップを作成する際に識別するソースおよびターゲット・スキーマは、XSLTマッパーに表示されます。ソースの属性またはリーフ要素をターゲットの属性またはリーフ要素にコピーするには、ソースをターゲットにドラッグ・アンド・ドロップします。より複雑なマッピングを行うには、関数を(中央の)マッパー・キャンバスにドラッグ・アンド・ドロップし、ソース・ノードとターゲット・ノードに関数を接続します。コンポーネント・パレットから、次のマッピング機能を使用できます。
Advanced functions: 拡張関数の例としては、XMLファイルの値を参照するためのlookup-xmlや、XPath式をマッピングに組み込むことができるxpath-expressionがあります。
Code snippets: Javaコードをマッピングに追加できます。
Conversion functions: 例としては、パラメータをブール型に変換するbooleanや、パラメータを文字列に変換するstringがあります。
Cumulative functions: ノード・セットのノードの数や合計を算出できます。
Database functions: データベースを問合せできます。
Date functions: 例としては、現在日をISO書式で戻すcurrent-dateや、現在のタイムゾーンをISO書式で戻すimplicit-timezoneがあります。
Logical functions: 例としては、論理積(and)、論理和(or)、パラメータを比較する関数(greater、lessなど)があります。
Mathematical functions: 例としては、入力した数の絶対値を戻すabsや、add、subtract、multiply、divideなどの算術演算子があります。
Node-set functions: 例としては、唯一のメンバーとして現在のノードを保持するノードセットを戻すcurrentや、メイン・ソース文書以外のXML文書にアクセスできるdocumentがあります。
String functions: 例としては、2つの文字列の連結を戻す(たとえば、firstとlastの名前要素を連結し、ターゲットのfullname要素にマップする)concatや、すべての文字が小文字に変換された入力文字列を戻すlower-caseがあります。
User-defined extension functions: Java関数の独自のセットをインポートできます。「ツール」メニューから、「設定」→「XSLマップ」の順に選択します。
User-defined named templates: 複雑なマッピングの場合は、XSLT言語でテンプレートを定義し、関数と同様に使用できます。
XML: XMLコンテンツを操作したり、XMLコンテンツに関する情報を取得できます。
XSLT constructs: 例としては、マップに条件を適用(たとえば、存在している場合のみソースをターゲットにマッピング)できるxsl:ifや、ソース内の繰返し要素をターゲット内の繰返し要素にマップするfor-eachがあります(配列の処理に便利です)。
WC3-recommended XSLTs: 例としては、算出された名前で要素を作成するxsl:elementや、要素を使用して属性を結果要素に追加するxsl:attributeがあります。World Wide Web Consortiumが推奨するXSLTの詳細は、次のサイトを参照してください。
www.w3.org/1999/Transform
BPELプロセスとESBプロジェクトでは、同じXSLTを使用できます。
図7-13に示すように、プロパティ・インスペクタには、選択したXSD要素のプロパティが表示されます。
詳細は、『Oracle BPEL Process Manager開発者ガイド』の次のトランスフォーメーションおよびXSLTマッパーに関する項を参照してください。
XSLTマッパーおよびコンテキスト依存メニューの使用例(定数値の設定、拡張関数の使用、関数パラメータの編集、関数の連鎖およびXPath式の編集の方法も含む)
XSLTマッパーを使用せずにXSLマップ・ファイルを作成する方法
自動マップ・プリファレンス機能を使用してノードを自動的にマップする方法
ディクショナリの生成機能を使用してマッピング・ディクショナリ(マッピング用シノニム)を生成、およびレポートの生成機能を使用してHTMLレポートを生成する方法
マップのテスト方法
トランスフォーメーションを作成するには、transformアクティビティとXSLTマッパーを使用します。XSLTマッパーは、ソース・スキーマの要素をターゲット・スキーマの要素に割り当てます。
トランスフォーメーションを作成する手順は、次のとおりです。
「Transform」アクティビティをBPELプロセスにドラッグ・アンド・ドロップします。
「Transform」アクティビティをダブルクリックします。
「Transform」ダイアログ(図7-14を参照)を使用して、ソースおよびターゲットのスキーマ情報を入力します。
要素をマップするソース変数を選択します。
マップするソースの変数パート(たとえば、発注リクエストで構成されるペイロード・スキーマ)を選択します。
要素がマップされるターゲット変数を選択します。
マップされるターゲットの変数パート(たとえば、請求で構成されるペイロード・スキーマ)を選択します。
マッパー・ファイル名を入力するか、デフォルト名をそのまま使用します。あるいは、懐中電灯アイコンを使用してファイルを参照します。
このファイルには、XSLTマッパー・トランスフォーメーション・ツールを使用して作成したマッピングが格納されます。
「マッピングの作成」アイコンをクリックします。
図7-12に示すように、XSLTマッパーを使用して、ソース属性またはリーフ要素をターゲット属性またはリーフ要素にドラッグ・アンド・ドロップします。この作業を簡素化するには、コンポーネント・パレットの関数および自動マップ機能を使用します。
XSLマップ・ファイルは、XSLスタイルシートから作成することもできます。Oracle JDeveloperの「ファイル」メイン・メニューから、「新規」→「XML」→「XSLスタイルシートからのXSLマップ」の順にクリックします。
XSLTマッパーでソースからターゲットにドラッグする手順については、『Oracle BPEL Process Manager Order Bookingチュートリアル』を参照してください。
XSLTマッパーを使用すると、トランスフォーメーションがXSLマップ・ファイルに取得されます。例7-5に、SOAOrderBooking.wsdlの注文スキーマを、Web注文サービスに必要なデータベース・スキーマにマップする、TransformOrder.xslのソース・コードを示します。
例7-5 TransformOrder.xslのソース・コード
<?xml version="1.0" encoding="UTF-8" ?>
<?oracle-xsl-mapper
<!-- SPECIFICATION OF MAP SOURCES AND TARGETS, DO NOT MODIFY. -->
<mapSources>
<source type="WSDL">
<schema location="SOAOrderBooking.wsdl"/>
<rootElement name="SOAOrderBookingProcessRequest" namespace="http://
www.globalcompany.com/ns/OrderBooking"/>
</source>
</mapSources>
<mapTargets>
<target type="XSD">
<schema location="Order_table.xsd"/>
<rootElement name="OrdersCollection" namespace="http://
xmlns.oracle.com/pcbpel/adapter/db/top/Order"/>
</target>
</mapTargets>
<!-- GENERATED BY ORACLE XSL MAPPER 10.1.3.1.0(build 060515.0101) AT [SAT JUL 08 16:58:22 PDT 2006]. -->
?>
<xsl:stylesheet version="1.0"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
xmlns:ns1="http://xmlns.oracle.com/SOAOrderBooking"
xmlns:ns4="http://www.globalcompany.com/ns/OrderBooking/rules"
xmlns:ns0="http://www.w3.org/2001/XMLSchema"
xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath"
xmlns:xp20="http://www.oracle.com/XSL/Transform/java/
oracle.tip.pc.services.functions.Xpath20"
xmlns:client="http://www.globalcompany.com/ns/OrderBooking"
xmlns:ns2="http://xmlns.oracle.com/pcbpel/adapter/db/top/Order"
xmlns:cu="http://www.globalcompany.com/ns/customer"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:po="http://www.globalcompany.com/ns/order"
xmlns:wf="http://schemas.oracle.com/xpath/extension"
xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath"
xmlns:orcl="http://www.oracle.com/XSL/Transform/java/
oracle.tip.pc.services.functions.ExtFunc"
exclude-result-prefixes="xsl plnk ns4 ns0 client po ns2 bpws hwf xp20 wf ids orcl">
<xsl:template match="/">
<ns3:OrdersCollection>
<ns3:Orders>
<ns3:comments>
<xsl:value-of select="/client:SOAOrderBookingProcessRequest/po:PurchaseOrder/
po:OrderInfo/po:OrderComments"/>
</ns3:comments>
<ns3:itemsCollection>
<xsl:for-each select="/client:SOAOrderBookingProcessRequest/po:PurchaseOrder/
po:OrderItems/po:Item">
<ns3:Items>
<ns3:partnum>
<xsl:value-of select="po:partnum"/>
</ns3:partnum>
<ns3:price>
<xsl:value-of select="po:price"/>
</ns3:price>
<ns3:productname>
<xsl:value-of select="po:ProductName"/>
</ns3:productname>
<ns3:quantity>
<xsl:value-of select="po:Quantity"/>
</ns3:quantity>
</ns3:Items>
</xsl:for-each>
</ns3:itemsCollection>
</ns3:Orders>
</ns3:OrdersCollection>
</xsl:template>
</xsl:stylesheet>