付録A.8 XSLTを用いたポートレット

XSLTスタイルシートを介して,XMLデータをポータルに取り込めます。

XMLデータの取り込みを次の図に示します。

図A-3 XMLデータの取り込み

[図データ]

アクセスするクライアントに応じて,XMLデータを変換します。また,UserAgent情報取得Beanを使用すると,アクセスしてきたクライアントに応じて,XSLTスタイルシートを変更できます。UserAgent情報取得Beanの詳細は,「14.8 UserAgent情報取得Bean」を参照してください。

XSLTスタイルシートは,次のディレクトリに格納します。

{PROJECT_HOME}¥portlets¥ポートレット名¥PORTLET-INF¥xslt

日立APIポートレットでは,<ut:convert>タグライブラリ内に,XMLデータを記述します。また,<ut:convert>のxslt属性には,XSLTスタイルシート名を指定します。タグライブラリの詳細は,「14.2 ポートレットユティリティタグライブラリ」を参照してください。

XSLTを用いたポートレットのサンプルを次に示します。このサンプルでは,ユーザに割り当てられた仕事一覧を表示します。データベースなどから,仕事一覧をXMLデータとして取得します。XSLTスタイルシートを使用して,クライアントがPCの場合はテーブルで,携帯電話(iモード,およびEZweb)の場合はリストで表示します。また,XMLデータの取得および<ut:convert>タグライブラリでは,<ut:cache>タグライブラリを使用して,60分ごとにデータを更新します。

<この項の構成>
(1) 日立APIポートレットの例
(2) XMLデータ
(3) PC用XSLTスタイルシート
(4) iモード用XSLTスタイルシート

(1) 日立APIポートレットの例

日立APIポートレットでXMLデータを取り込む例を次に示します。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ page import="jp.co.hitachi.soft.portal.portlet.PortletUtils" %>
<%@ page import="jp.co.hitachi.soft.portal.portlet.beans.PortletInfoBean" %>
<%@ page import="jp.co.hitachi.soft.portal.api.user.PortalUserInfoBean" %>
<jsp:useBean id="useragentInfo" scope="session"
            class="jp.co.hitachi.soft.portal.portlet.beans.UserAgentInfoBean" />
<%@ taglib uri="http://soft.hitachi.co.jp/portal/utils" prefix="ut" %>
<%
 String ns = PortletUtils.getNamespace(request, response);
 String xslt;
 try {
   PortalUserInfoBean userInfo = new PortalUserInfoBean();
   userInfo.setRequest(request);

   useragentInfo.initBean(request);
   if (useragentInfo.getUserAgentGroup().equals("PCBrowser")) {
     xslt = "table.xsl";  // PCはtable形式で出力
   } else {
     xslt = "list.xsl";  // PC以外はlist形式で出力
   }

   // ログイン済みかチェック
   if (userInfo.checkLoggedIn()) {
     PortletInfoBean pInfo = new PortletInfoBean();
     pInfo.initBean(request);
     PortletInfoBean.Mode mode = pInfo.getMode();
     if (mode == PortletInfoBean.Mode.DEFAULT ||
         mode == PortletInfoBean.Mode.MAXIMIZE) {
       String cacheKey = ns+"key";
%>
<ut:cache name="<%= cacheKey %>" time="60" scope="session">
 <ut:convert xslt="<%= xslt %>">
   <!-- XMLデータ(ログインユーザの仕事一覧)読み込み処理 -->
 </ut:convert>
</ut:cache>
<%
     } else { throw new Exception("未サポートの画面モード"); }
   } else { throw new Exception("ログインが必要です"); }
 } catch (Exception e) {
     // エラー出力
 }
%> 

(2) XMLデータ

XMLデータの例として,ユーザに割り当てられた仕事一覧を示します。

<task-list>
 <item>
   <title>提案書作成</title>
   <deadline>2002/04/01</deadline>
   <priority>高</priority>
   <detail>http://mytask/task.cgi?id=11111</detail>
 </item>

 <item>
   <title>営業方針検討資料作成</title>
   <deadline>2002/04/11</deadline>
   <priority>標準</priority>
   <detail>http://mytask/task.cgi?id=12111</detail>
 </item>
</task-list>

(3) PC用XSLTスタイルシート

PC用に,テーブルに変換するXSLTスタイルシートの例を次に示します。

{PROJECT_HOME}¥portlets¥weather¥xslt¥table.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="Shift_JIS"/>

 <xsl:template match="//task-list">
   <table border="1">
   <tr><th>タイトル</th><th>期限</th><th>優先度</th></tr>
   <xsl:for-each select="item">
     <tr>
     <td><a href="{detail}"><xsl:value-of select="title"/></a></td>
     <td><xsl:value-of select="deadline"/></td>
     <td><xsl:value-of select="priority"/></td>
     </tr>
   </xsl:for-each>
   </table>
 </xsl:template>
</xsl:stylesheet>

(4) iモード用XSLTスタイルシート

iモード用に,リストに変換するXSLTスタイルシートの例を次に示します。

{PROJECT_HOME}¥portlets¥weather¥xslt¥list.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="Shift_JIS"/>

 <xsl:template match="//task-list">
   <ol>
   <xsl:for-each select="item">
     <li>
       <xsl:variable name="number"><xsl:number/></xsl:variable>
       <a href="{detail}" accesskey="{$number}">
         <xsl:value-of select="title"/></a>
       (<xsl:value-of select="deadline"/>)
     </li>
   </xsl:for-each>
   </ol>
 </xsl:template>
</xsl:stylesheet>