標準のレスポンスXSLTが出力するHTMLは、非常にシンプルです。ここでは、SOAPレスポンスメッセージを下図のように変更するカスタムXSLTを作成してみます。この画面では、翻訳結果を表示し、かつ、次の翻訳処理を呼び出すことができます。
WebサービスのSOAPレスポンスメッセージの表示
まずは、翻訳WebサービスがレスポンスとしてどのようなXMLドキュメントを返しているのか観察してみましょう。
作成した「Translater.html」には、[翻訳]ボタンの横に、レスポンスの出力形式(XMLまたはHTML)を選択できるラジオボタンがあります。このラジオボタンは、サンプルフォームからそのまま流用したものです(Translater.htmlの30行目と31行目)。
「name」属性に指定している「ResXSLT」の意味は、下表のとおりです。
値 | 振る舞い |
---|---|
なし または "" | WS USP標準のXSLT変換を行います。 |
"none" | XSLT変換を行いません。 |
カスタムXSLTのURL | 指定されたXSLTを使って変換処理を行います。 |
“4.4.4 カスタムフォームの作成”にあるサンプルフォームのHTMLにカスタムXSLTを指定する場合は、30行目と31行目のチェックボックスを削除し、以下のような<input>タグを追加してください。
<input type="hidden" name="ResXSLT" value="http://Portalworksサーバ名:ポート番号/wscontrol/custom/Translater.xsl"/>
カスタムXSLTを指定せず、ラジオボタンのXMLを選択し、翻訳元の文を 「Web-Service is easy」にして、「英語からフランス語へ」翻訳した結果が、以下のSOAPレスポンスメッセージです。
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <namesp1:BabelFishResponse xmlns:namesp1="urn:xmethodsBabelFish"> <return xsi:type="xsd:string"> Web-Service est facile </return> </namesp1:BabelFishResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
カスタムXSLTの作成
SOAPレスポンスメッセージから、翻訳結果はルートから見て次の位置(XPath 式)にあることが分かります。
SOAP-ENV:Envelope/SOAP-ENV:Body/namesp1:BabelFishResponse/return
この情報を元に、作成したのが次のカスタムXSLTです。
カスタムXSLT(Translater.xsl)
1: <?xml version="1.0" encoding="Shift_JIS"?> 2: <xsl:stylesheet 3: xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” 4: xmlns:SOAP-ENV=”http://schemas.xmlsoap.org/soap/envelope/” 5: xmlns:namesp1="urn:xmethodsBabelFish" 6: version="1.0"> 7: 8: <xsl:output method="html" encoding="UTF-8"/>
9: <xsl:template match="/"> 10: <html> 11: <head> 12: <title>Translater</title> 13: </head> 14: 15: <body> 16: 17: <h2>翻訳</h2> 18: <form action="$pwdir:c/$pwsrv;pw%3AsponsorAction=invoke" method="post">
19: <input type="hidden" name="WSDL"
value="http://www.xmethods.net/sd/2001/BabelFishService.wsdl"/> 20: <input type="hidden" name="operation" value="BabelFish"/> 21: <input type="hidden" name="ResXSLT"
value="http://Portalworksサーバ名:ポート番号/wscontrol/custom/Translater.xsl"/>
22: 翻訳する文: 23: <br/> 24: <textarea name="sourcedata" rows="5" cols="40"></textarea> 25: <br/> 26: <select name="translationmode"> 27: <option value="en_fr">英語からフランス語へ</option> 28: <option value="en_de">英語からドイツ語へ</option> 29: <option value="en_it">英語からイタリア語へ</option> 30: <option value="en_pt">英語からポルトガル語へ</option> 31: <option value="en_es">英語からスペイン語へ</option> 32: <option value="fr_en">フランス語から英語へ</option> 33: <option value="de_en">ドイツ語から英語へ</option> 34: <option value="it_en">イタリア語から英語へ</option> 35: <option value="pt_en">ポルトガル語から英語へ</option> 36: <option value="es_en">スペイン語から英語へ</option> 37: </select> 38: <input type="submit" value="翻訳"/> 39: </form> 40: 41: <h2>結果</h2> 42: <p> 43: <xsl:value-of select="SOAP-ENV:Envelope/SOAP-ENV:Body/namesp1:BabelFishResponse/return"/>
44: </p> 45: 46: </body> 47: </html> 48: </xsl:template> 49: 50: </xsl:stylesheet>
このXSLTでポイントとなる行は、8行目、18行目、21行目、43行目です。その他の部分は、「Translater.html」とほぼ同じHTMLを出力するようになっています。
8行目
エンコーディング形式は、つねにUTF-8 としてください。
18行目
"$pwdir"と"$pwsrv"は、Portalworksの予約語ですので、XSLTのパラメータとして使用しないでください。
21行目
「hidden」 属性で翻訳結果を処理するXSLTを指定しています。この例では、「Translater.xsl」です。
43行目
<xsl:value-of>の「select」属性で、レスポンスのSOAPメッセージから翻訳結果を取り出しています。
XSLTの詳細については、市販の専門書などを参照してください。
カスタムXSLTの配置と指定
作成したカスタムXSLT(Translater.xsl)を、以下のフォルダ内に配置します。ただし、「custom」というフォルダが存在しない場合は、フォルダを新規に作成してから配置してください。
[J2EE共通ディレクトリ]\ijserver\PortalServer\apps\wscontrol.war\custom
(J2EE共通ディレクトリのデフォルトは、C:\Interstage\J2EE\var\deployment です。)
/opt/FJSVj2ee/var/deployment/ijserver/PortalServer/apps/wscontrol.war/custom
次に、つねにカスタムXSLTを使ってレスポンスを整形するように、“4.4.4 カスタムフォームの作成”にある「カスタムフォーム(Translater.html)」を修正します(12行目)。
「value」属性の値は、カスタムXSLTのURLです。
1: <html> 2: <head> 3: <title>Translater</title> 4: </head> 5: <body> 6: 7: <h2>翻訳</h2> 8: <form action="$pwdir:c/$pwsrv;pw%3AsponsorAction=invoke" method="post"> 9: <input type="hidden" name="WSDL" 10: value="http://www.xmethods.net/sd/2001/BabelFishService.wsdl"/> 11: <input type="hidden" name="operation" value="BabelFish"/> 12: <input type="hidden" name="ResXSLT"
value="http://Portalworksサーバ名:ポート番号/wscontrol/custom/Translater.xsl"/>
13: 翻訳する文: 14: <br> 15: <textarea name="sourcedata" rows="5" cols="40"></textarea> 16: <br> 17: <select name="translationmode"> 18: <option value="en_fr">英語からフランス語へ</option> 19: <option value="en_de">英語からドイツ語へ</option> 20: <option value="en_it">英語からイタリア語へ</option> 21: <option value="en_pt">英語からポルトガル語へ</option> 22: <option value="en_es">英語からスペイン語へ</option> 23: <option value="fr_en">フランス語から英語へ</option> 24: <option value="de_en">ドイツ語から英語へ</option> 25: <option value="it_en">イタリア語から英語へ</option> 26: <option value="pt_en">ポルトガル語から英語へ</option> 27: <option value="es_en">スペイン語から英語へ</option> 28: </select> 29: <input type="submit" value="翻訳"/> 30: </form> 31: </body> 32: </html>
最後に、ポータルページから翻訳Webサービスのブリックにアクセスして、動作を確認してください。画面にエラーメッセージが表示される場合は、カスタムXSLTのパスに誤りがないか、XSLファイルに文法エラーがないかを確認してください。
ここまでで説明した手順で、インターネット上に公開されているさまざまなWebサービスをPortalworksから利用することができます。
ここで説明に使用した例は、単体のWebサービスを呼び出して、そのレスポンスを表示するものですが、Portalworksのシナリオ機能を利用すれば、あるWebサービスのレスポンスを他のWebサービスの入力とするような複数のWebサービスの間でサービスの連携を行うこともできます。