Oracle Application Server Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス
10g

部品番号: A97678-01
       

XMLおよびXSLタグのサポートについて

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

このトピックには、次の項目が含まれます。


注意:

JSPページでのXML関連機能の追加情報は、Oracle Containers for J2EE Support for JavaServer Pages開発者ガイド 10gを参照してください。


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

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

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タグ
タグ ライブラリ(Library) プロデューサ/コンシューマ 関連属性 タグ情報

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ディレクティブが存在する必要があります。Oracle Application Serverのインストール時に、TLDファイルは既知のタグ・ライブラリ・ディレクトリに配置されます。taglibディレクティブと既知のタグ・ライブラリ・ディレクトリの詳細は、Oracle Application Server Containers for J2EE Support for JavaServer Pages開発者ガイド 10gを参照してください。

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>
 
    

この例では、次に示すような出力が生成されます。

xslsamp.gifのテキスト説明が続きます。

図xslsamp.gifの説明

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.dtd emailWithDtd.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>