Oracle9iAS Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス
リリース9.0.3

部品番号 J06903-01
       

XMLとXSLに関するタグのサポート

このトピックでは、OC4Jが提供する、XMLデータおよびXSL変換に使用できるタグについて説明します。また、他のOC4JタグでのXMLの追加機能のサマリーを示します。これらのタグは、JSP仕様に従って実装されます。

このトピックの構成は、次のとおりです。


注意: 

JSPページに対するXML関連機能の追加情報は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。


XMLをサポートするOracleタグの概要

この項では、OC4Jが提供するXML機能を備えたタグの概要を説明します。これらのタグは、XML DOMオブジェクトを入力として取得できるタグ、XML DOMオブジェクトを出力として生成できるタグ、指定したスタイルシートに基づいてXML文書を変換するタグ、およびデータを入力ストリームからXML DOMオブジェクトに解析するタグです。次の項目について説明します。

XMLプロデューサとXMLコンシューマ

XML関連操作は、次のいずれか(または両方)に分類できます。

同様に、XML関連タグも、XMLプロデューサまたはXMLコンシューマ(あるいはその両方)に分類できます。XMLプロデューサは、XMLオブジェクトをXMLコンシューマに明示的にまたは暗黙的に渡すことができます。暗黙的に渡すことを「無名の受渡し」と呼びます。

XML関連タグ間での明示的な受渡しの場合、プロデューサ・タグではtoXMLObjName属性が、コンシューマ・タグではfromXMLObjName属性が使用されます。この受渡し処理は、背後で、JSPの標準pageContextオブジェクトのgetAttribute()メソッドとsetAttribute()メソッドを使用して実行されます。次は、明示的な受渡しの使用例です。


<sql:dbQuery output="XML" toXMLObjName="foo" ... >
   ...SQL query...
</sql:dbQuery>
...
<ojsp:cacheXMLObj fromXMLObjName="foo" ... />

XML関連タグ間での暗黙的な受渡しの場合、toXMLObjName属性とfromXMLObjName属性は使用しないでください。この受渡し処理は、タグ・ハンドラ間での直接的な相互作用によって実行されます。この場合、通常タグはネストされています。次は、暗黙的な受渡しの使用例です。


<ojsp:cacheXMLObj ... >
   <sql:dbQuery output="XML" >
      ...SQL query...
   </sql:dbQuery>
</ojsp:cacheXMLObj>

この例では、dbQueryタグで作成されたXMLは、pageContextオブジェクトに格納されず、cacheXMLObjタグに直接渡されます。

暗黙的な受渡しでは、タグがコンシューマとして機能できるように、タグ・ハンドラは、OC4J ImplicitXMLObjConsumerインタフェースを次のように実装します。


interface ImplicitXMLObjConsumer
{
   void setImplicitFromXMLObj();
}

XML機能を持つOC4Jタグのサマリー

OC4Jが提供するタグ・ライブラリに関して、表5-1に、XMLプロデューサまたはコンシューマとして機能できるタグのサマリーを示します。

表5-1 XML機能を持つOC4Jタグ
タグ ライブラリ プロデューサ/コンシューマ 関連属性 タグ情報

transform/styleSheet

XML

両方

fromXMLObjName
toXMLObjName

XML/XSLデータ変換用のXML transformタグとstyleSheetタグ

parsexml

XML

プロデューサ

toXMLObjName

入力ストリームからの変換を行うXML parsexmlタグ

cacheXMLObj

Web Object Cache(およびXML)

両方

fromXMLObjName
toXMLObjName

Web Object CacheのcacheXMLObjタグ

dbQuery

SQL

プロデューサ

toXMLObjName

SQL dbQueryタグ


注意: 

  • XML transformタグとstyleSheetタグは同じ機能を持ち、同一の結果を生成します。

  • cacheXMLObjタグをXMLタグ・ライブラリ・ディスクリプタ・ファイル(xml.tld)とWeb Object Cacheタグ・ライブラリ・ディスクリプタ・ファイル(jwcache.tld)の両方に定義すると便利です。


XMLユーティリティ・タグ

この項では、OC4Jが提供するXMLユーティリティ・タグについて説明します。構成は、次のとおりです。

XMLユーティリティ・タグ・ライブラリを使用するには、タグ・ライブラリ・ディスクリプタ・ファイルxml.tldが、アプリケーションとともにデプロイされている必要があります。また、ライブラリを使用するJSPページには、適切なtaglibディレクティブが存在する必要があります。Oracle9iASのインストール時、TLDファイルは、予約済のタグ・ライブラリ・ディレクトリに置かれます。taglibディレクティブと予約済のタグ・ライブラリ・ディレクトリの詳細は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。

XMLタグ・ライブラリを使用するには、ojsputil.jarファイル、xmlparserv2.jarファイルおよびxsu12.jar(JDK 1.1.xの場合はxsu111.jar)ファイルがインストール済で、クラスパスに存在している必要があります。これらのファイルは、OC4Jに含まれています。


注意: 

  • このタグ構文では、接頭辞「xml:」が使用されます。これは、表記規則に従っていますが、必須ではありません。任意の接頭辞をtaglibディレクティブに指定できます。

  • このヘルプのタグ構文規則の詳細は、「タグ構文の表記と意味」を参照してください。


XMLユーティリティ・タグの説明

この項では、次のユーティリティ・タグについて説明します。


重要: 

タグの属性はリクエスト時属性です。つまり、特に注記がないかぎり、タグ属性はJSP式を入力として取得できます。


XML/XSLデータ変換用のXML transformタグとstyleSheetタグ

XMLとXSLを動的JSPページに頻繁に使用する場合は、結果をクライアントに戻す前に、サーバーでXSL変換を行う必要があります。この処理を簡素化するために、Oracleでは、XMLライブラリに2つの同義のタグを用意しています。結果をHTTPクライアントに直接出力することも、指定したXML DOMオブジェクトに出力することもできます。この項の説明と例のように、transformタグまたはstyleSheetタグのいずれかを使用します。この2つのタグによって得られる効果は同じです。

それぞれのタグは、XMLプロデューサとXMLコンシューマの両方の役割を果たします。次のいずれかを入力として取得できます。

これらのタグは、次のいずれか、または両方に出力できます。ただし、いずれの場合も適用するスタイルシートを指定する必要があります。

各タグは、開始タグと終了タグの間にあるそのボディの内容に適用されます。1つのページ内に複数のXSL変換ブロックを設定できます。この場合、各ブロックはそのブロック自体のtransformタグまたはstyleSheetタグでバインドされ、適切なスタイルシートへの独自のhrefポインタを指定します。

構文


<xml:transform href="xslRef"
             [ fromXMLObjName = "objectname" ]
             [ toXMLObjName = "objectname" ]
             [ toWriter = "true" | "false" ] >

   [...body...]

</xml:transform >

または


<xml:styleSheet href="xslRef"
             [ fromXMLObjName = "objectname" ]
             [ toXMLObjName = "objectname" ]
             [ toWriter = "true" | "false" ] >

   [...body...]

</xml:styleSheet >

属性

入力ストリームからの変換を行うXML parsexmlタグ

XMLタグ・ライブラリには、XMLプロデューサ・ユーティリティ・タグparsexmlが含まれています。このタグは、入力ストリームからXML DOMオブジェクトに変換します。このタグによって、指定したリソースまたはタグ・ボディから入力を取得できます。

構文


<xml:parsexml
             [ resource = "xmlresource" ]
             [ toXMLObjName = "objectname" ]
             [ validateResource = "dtd_path" ]
             [ root = "dtd_root_element" ] >

   [...body...]

</xml:parsexml >

属性

XMLユーティリティ・タグの例

この項では、次の例を示します。

transformタグの使用例

この項では、XSLスタイルシートのサンプルと、そのスタイルシートでtransformタグを使用して出力をフィルタ処理するJSPページのサンプルを示します。これは極端に単純化した例です。ページ内のXMLは静的なものです。より現実的な例では、JSPページを使用して、変換の実行前にXMLのすべてまたは一部を動的に生成します。

サンプル・スタイルシート: hello.xsl


<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="page">
   <html>
    <head>
     <title>
      <xsl:value-of select="title"/>
     </title>
    </head>
    <body bgcolor="#ffffff">
     <xsl:apply-templates/>
    </body>
   </html>
  </xsl:template>

  <xsl:template match="title">
   <h1 align="center">
    <xsl:apply-templates/>
   </h1>
  </xsl:template>
  <xsl:template match="paragraph">
   <p align="center">
    <i>
     <xsl:apply-templates/>
    </i>
   </p>
  </xsl:template>

</xsl:stylesheet>

サンプルJSPページ: hello.jsp


<%@ page session = "false" %>
<%@ taglib uri="/WEB-INF/xml.tld" prefix="xml" %>

<xml:transform href="style/hello.xsl" >

<page>
 <title>Hello</title>
 <content>
  <paragraph>This is my first XML/XSL file!</paragraph>
 </content>
</page>

</xml:transform>

この例では、次の出力が生成されます。

Text description of xslsamp.gif follows.

transformタグとdbQueryタグの使用例

この例では、dbQueryタグから結果セットを戻し、transformタグを使用して、XSLスタイルシートrowset.xslで問合せ結果をフィルタ処理します(コードを次に示します)。また、dbOpenタグを使用して接続をオープンします。接続文字列は、requestオブジェクトまたはsetconn.jspページのいずれかから取得されます(コードを次に示します)。dbOpenタグからtransformタグへのデータの受渡しは暗黙的に実行されます。関連情報は、「SQL dbQueryタグ」および「SQL dbOpenタグ」を参照してください。

JSPページ


<%@ page import="oracle.sql.*, oracle.jdbc.driver.*, oracle.jdbc.*, java.sql.*"
%>
<%@ taglib uri="/WEB-INF/xml.tld" prefix="xml" %>
<%@ taglib uri="/WEB-INF/sqltaglib.tld" prefix="sql" %>

<%
   String connStr=request.getParameter("connStr");
   if (connStr==null) {
     connStr=(String)session.getValue("connStr");
   } else {
     session.putValue("connStr",connStr);
   }
   if (connStr==null) { %>
<jsp:forward page="../../sql/setconn.jsp" />
<%
   }

%>
<h3>Transform DBQuery Tag Example</h3>
<xml:transform href="style/rowset.xsl" >
<sql:dbOpen connId="conn1" URL="<%= connStr %>"
              user="scott" password="tiger">
    </sql:dbOpen>
    <sql:dbQuery connId="conn1" output="xml" queryId="myquery" >
       select ENAME, EMPNO from EMP order by ename
    </sql:dbQuery>
    <sql:dbCloseQuery queryId="myquery" />
    <sql:dbClose connId="conn1" />
</xml:transform>

rowset.xsl


<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="ROWSET">
 <html><body>
 <h1>A Simple XML/XSL Transformation</h1>
 <table border="2">
<xsl:for-each select="ROW">
  <tr>
    <td><xsl:value-of select="@num"/></td>
    <td><xsl:value-of select="ENAME"/></td>
    <td><xsl:value-of select="EMPNO"/></td>
  </tr>
</xsl:for-each>
</table>
</body></html>
</xsl:template>
</xsl:stylesheet>

setconn.jsp


<body bgcolor="#FFFFFF">
<font size=+0>
<B>Please enter a suitable JDBC connection string, before you try the above
demo</B>
<pre>
     To use the thin driver insert your host, port and database id.
     Once you have set the connection string it will remain in effect until
     the session times out for most demos.  For Connection Cache demos
     which use application scope on most servlet engines the connection
     string will remain in effect for the life of the application.
</pre>
<%
   String connStr;
   connStr=request.getParameter("connStr");
   if (connStr==null) {
     connStr=(String)session.getValue("connStr");
   }
   if (connStr==null) {
     connStr="jdbc:oracle:thin:@localhost:1521:orcl";  // default connection str
   }

   session.putValue("connStr",connStr);
%>
<FORM METHOD=get>
<INPUT TYPE="text" NAME="connStr" SIZE=40 value="<%=connStr%>" >
<INPUT TYPE="submit" VALUE="Set Connection String" >
</FORM>
</font>

transformタグとparsexmlタグの使用例

この項では、XSLスタイルシートのemail.xslを使用して、parsexmlタグから出力を取得し、その出力をtransformタグによってフィルタ処理する例を2つ示します。いずれの場合も、データは、指定したリソースのXMLファイルからparsexmlタグ・ハンドラによって収集された後、toxml1 XMLオブジェクトを介してparsexmlタグからtransformタグに明示的に渡されます。

最初の例では、XMLリソースemail.xmlと個別のDTDであるemail.dtdを使用します。root属性は指定されていません。したがって、妥当性チェックは、トップレベル要素の<email>から行われます。

第2の例では、XMLリソースemailWithDtd.xmlを使用します。このファイルには、DTDが埋め込まれています。root属性によって、妥当性チェックが要素<email>から行われることが明示的に指定されています。

email.xmlemail.dtdemailWithDtd.xmlおよびemail.xslの各ファイルも次に示します。

transformとparsexmlの使用例1


<%@ taglib uri="/WEB-INF/xml.tld" prefix="xml" %>
<h3>XML Parsing Tag Email Example</h3>
<xml:transform fromXMLObjName="toxml1" href="style/email.xsl">
   <xml:parsexml resource="style/email.xml" validateResource="style/email.dtd"
                toXMLObjName="toxml1">
   </xml:parsexml>
</xml:transform>

transformとparsexmlの使用例2


<%@ taglib uri="/WEB-INF/xml.tld" prefix="xml" %>
<h3>XML Parsing Tag Email Example</h3>
<xml:transform fromXMLObjName="toxml1" href="style/email.xsl">
   <xml:parsexml resource="style/emailWithDtd.xml" root="email"
                 toXMLObjName="toxml1">
   </xml:parsexml>
</xml:transform>

email.xml


<email>
<recipient>Manager</recipient>
<copyto>jsp_dev</copyto>
<subject>XML Bug fixed</subject>
<bugno>BUG 1109876!</bugno>
<body>for reuse tag and checked in the latest version!</body>
<sender>Developer</sender>
</email>

email.dtd


<!ELEMENT email (recipient,copyto,subject,bugno,body,sender)>
<!ELEMENT recipient (#PCDATA)>
<!ELEMENT copyto (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT bugno (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ELEMENT sender (#PCDATA)>

emailWithDtd.xml


<!DOCTYPE email [
<!ELEMENT email (recipient,copyto,subject,bugno,body,sender)>
<!ELEMENT recipient (#PCDATA)>
<!ELEMENT copyto (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ELEMENT bugno (#PCDATA)>
<!ELEMENT body (#PCDATA)>
<!ELEMENT sender (#PCDATA)>]>
<email>
<recipient>Manager</recipient>
<copyto>jsp_dev</copyto>
<subject>XML Bug fixed</subject>
<bugno>BUG 1109876!</bugno>
<body>for reuse tag and checked in the latest version!</body>
<sender>Developer</sender>
</email>

email.xsl


<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match="email">
 <html><body>
  To: <xsl:value-of select="recipient"/>
  CC: <xsl:value-of select="copyto"/>
  Subject:   <xsl:value-of select="subject"/> ...
  <xsl:value-of select="body"/> !!
  Thanks  <xsl:value-of select="sender"/>
</body></html>
</xsl:template>
</xsl:stylesheet>