Web サービス アプリケーションに関する一般的な問題は、実際のバックエンド ソフトウェアが XML をサポートしていない (または、少なくとも Web サービスで使用される標準化された XML をサポートしていない) ことです。この問題を解決するために、多くのアーキテクチャでは、受信した XML を解釈し、バックエンド システムが認識できるより適切な形式に変換する変換フェーズを実装しています。 XML をさまざまな形式に変換する方法は数多くありますが、拡張可能なスタイルシート言語 (eXtensibleStylesheet Language、XSL) は、堅牢で標準的な XML フレンドリーなソリューションを提供します。
よくある質問
XML メッセージとそれを処理するアプリケーションの間で変換が必要になる場合は、さまざまな方法があります。ただし、次のような一般的な問題が数多くあります。
ルックアップ
マッピング
集計
分割
数式
並べ替え
クエリ処理は、受信した値を受け入れ、それをターゲット システムの別の値にマップします。たとえば、XML の値は 309 ですが、アプリケーションに必要な値は「Uber Widget」です。
マッピングは基本的に、あるフィールドから別の値に値を再割り当てします。たとえば、XML では、CustomerAccountNumber という新しい要素に再割り当てする必要がある AccountNumber 要素がある場合があります。
集計処理は、XML の 2 つ以上の項目をバックエンド システムの 1 つの項目に結合することです。一般的な例は、姓と名のフィールドを 1 つの名前 (フィールド) に結合することです。分割は、XML 値を 2 つ以上の個別のコンポーネントに分割する集計の逆です。
数式処理には通常、新しいアプリケーションの値を取得するための 1 つ以上の XML 値の計算が含まれます。一例として、XML サブオーダーを使用して注文の合計金額を計算することが挙げられます。
最後に、並べ替えは、XML 内の項目の順序や構造を変更して、ターゲット システムが予期する順序や構造に適合させるプロセスです。
マッピング例
次に、例を使用してこのプロセスを詳しく見てみましょう。受信した XML がリスト 1 のようなものであると仮定します。
リスト 1: webserviceorder.xml
<?xml version="1.0" ?> <Order> <OrderNumber>8100</OrderNumber> <AccountNumber>99213</AccountNumber> <Item> <SKU>2388</SKU> <Description>Uber Widget</Description> <Quantity>15</Quantity> <PRicePer>10.95</PricePer> </Item> <Item> <SKU>6273</SKU> <Description>Flangeoid</Description> <Quantity>10</Quantity> <PricePer>52.00</PricePer> </Item> </Order>
ここで、注文システムには少し異なる形式が必要です。必要なのは、Web サービスから受け取った注文をリスト 2 の形式に変換することだけです。
リスト 2: アプリケーションの順序。最初に注意しなければならないことは、いくつかの要素をマップする必要があることです:
Order を NewOrder にマップ
AccountNumber を CustomerAccountNumber にマップ
Item を OrderItem にマップ
PricePer を CustomerPrice にマップ
次に、次のことを行う必要があります。 OrderItem 要素を OrderItems という新しい要素の下に再配置します。最後に、単価と数量に基づいて計算される小計という新しい要素を追加します。
マッピング変換は、テンプレート内で新しい要素を定義し、この新しい要素が受信した XML ドキュメント内の要素の値を持つように指定するだけなので、最も簡単です。項目の並べ替えは、項目サブテンプレートの呼び出しを OrderItems という新しい要素に配置することによって実行されます。最後に、単純な XPath 式を使用して計算を実行します。リスト 3 は、受信した XML をアプリケーション固有の XML に変換するために使用される XSL ドキュメントを示しています。
リスト 3:translate.xsl
<?xml version="1.0" encoding="UTF-8" ?> <NeWorder> <CustomerAccountNumber>99213</CustomerAccountNumber> <CustomerOrderNumber>8100</CustomerOrderNumber> <OrderItems> <OrderItem> <SKU>2388</SKU> <CustomerPrice>10.95</CustomerPrice> <Quantity>15</Quantity> <Subtotal>164.25</Subtotal> </OrderItem> <OrderItem> <SKU>6273</SKU> <CustomerPrice>52.00</CustomerPrice> <Quantity>10</Quantity> <Subtotal>520</Subtotal> </OrderItem> </OrderItems> </NewOrder>