トランスフォーメーションは、ソース・スキーマの要素をターゲット・スキーマの要素にマップします。通常、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>