ヘッダーをスキップ
Oracle® XML Developer's Kitプログラマーズ・ガイド
11gリリース2 (11.2)
B56264-06
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

6 XSLT Processor for Javaの使用

この章の内容は次のとおりです。

XSLT Processorの概要

この項の内容は次のとおりです。

前提条件

XSLTは、1つのXML文書を別のテキスト文書に変換するために使用できるXMLベースの言語です。たとえば、XSLTを使用してXMLデータ文書を入力として受け取り、文書の要素値に対して算術計算を実行し、計算結果を示すXHTML文書を生成できます。XSLTでは、XPathはソース・ノード・ツリーの要素をナビゲートおよび処理するために使用されます。XPathは、XML文書をノードから構成されるツリーとしてモデル化します。XPathノード・ツリー内のノードのタイプは、DOMツリー内のノードのタイプに対応します。

この章では、次のW3C標準を十分に理解していると想定します。

標準と仕様

XSLTには現在、XSLT 2.0の草案およびXSLT 1.0勧告という2つのバージョンがあります。仕様は次のURLにあります。

XPathは、XSLTおよびその他のXML言語で使用されるナビゲーショナル言語であり、XPath 2.0の草案およびXPath 1.0勧告という2つのバージョンがあります。2つのXPathバージョンの仕様は次のURLにあります。

Oracle XDK XSLT Processorは、XSLTとXPathの1.0標準、およびXSLTとXPathの2.0標準の最新草案を実装します。XDK XSLT Processorでは、XPath 2.0の関数および演算子がサポートされます。仕様は次のURLにあります。

http://www.w3.org/TR/xpath-functions/

関連項目:

XDKがサポートする標準の概要は、第31章「XDK標準」を参照してください。

XSLT 1.0および2.0でのXML変換

Oracle Database 10gでは、XDKはXSLT 1.0に含まれていない便利な機能をいくつか提供しています。XSLT 2.0を使用するには、次のようにスタイルシートにversion属性を設定します。

<? xml-stylesheet version="2.0" ... ?>

XSLT 2.0の最も便利な機能を次にいくつか示します。

  • ユーザー定義関数

    <xsl:function>宣言を使用して関数を定義できます。この要素には、関数名を定義するために1つのname属性が必要です。name属性の値はQNameです。<xsl:function>要素の内容は、関数の形式的な引数を指定する0個以上のxsl:param要素と、それに続く、関数から戻される値を定義する順序コンストラクタです。

    QNameはnullの名前空間を持つことができますが、ユーザー定義関数にはnull以外の名前空間が必要です。つまり、abcが名前空間として定義されている場合、addは有効なユーザー定義関数ではありませんが、abc:addは有効なユーザー定義関数です。

  • グループ化

    <xsl:for-each-group>要素、current-group()関数およびcurrent-grouping-key()関数を使用して、アイテムをグループ化できます。

  • 複数結果文書

    <xsl:result-document>要素を使用して結果ツリーを作成できます。<xsl:result-document>要素の内容は、ツリーの文書ノードの子に対する順序コンストラクタです。

    たとえば、この要素を使用すると、XML文書を入力として受け取り、別々の文書に分割できます。書籍のリストを記述するXML文書を受け取り、各書籍に関するXHTML文書を生成できます。次に、各出力文書を検証できます。

  • 一時ツリー

    XSLT 1.0のようにXSL変換の中間結果とXSL変数を文字列で表現するかわりに、これらを一連の文書ノードとして格納できます。<xsl:variable><xsl:param>および<xsl:with-param>要素で構築できる文書ノードは、一時ツリーと呼ばれます。

  • 文字マッピング

    XSLT 1.0では、文字のエスケープを指定するには<xsl:text>および<xsl:value-of>要素のdisable-output-escaping属性を使用する必要がありました。XSLT 2.0では、最上位レベルのスタイルシート要素としてマッピング文字を<xsl:character-map>要素で宣言できます。この要素を使用して、XSLT出力に<>&などの予約文字や無効なXML文字のあるファイルを生成できます。


関連項目:

http://www.w3.org/TR/xslt20にあるXSLT 2.0の機能の説明と例

XSLT Processor for Javaの使用: 概要

Oracle XDK XSLT Processorは、XML文書を別のテキストベース形式に変換するソフトウェア・プログラムです。たとえば、プロセッサはXMLをXML、HTML、XHTMLまたはテキストに変換できます。プロセッサは、APIを使用してプログラムで起動するか、コマンドラインから実行できます。XSLT Processorは、次のタスクを実行できます。

  • 1つ以上のXSLTスタイルシートを読み取ります。プロセッサは、1つのXML入力文書に複数のスタイルシートを適用し、異なる結果を生成できます。

  • 1つ以上の入力XML文書を読み取ります。プロセッサは、1つのスタイルシートを使用して複数のXML入力文書を変換できます。

  • スタイルシートのルールを入力XML文書に適用して、出力文書を構築します。出力は、DOMツリー、出力ストリームまたは一連のSAXイベントです。

XSLTは関数ベースの言語であり、一般に変換を実行するには入力文書およびスタイルシートのDOMを必要としますが、XSLTプロセッサのJava XDK実装は、より少ないリソースで効率的に変換を実行するために、SAXを使用してスタイルシート・オブジェクトを作成できます。このスタイルシート・オブジェクトを再利用して、スタイルシートを再解析せずに複数の文書を変換できます。

XSLT Processorの使用: 基本プロセス

図6-1に、XSLT Processor for Javaの基本設計を示します。


関連項目:

XMLParserクラスおよびXSDBuilderクラスの詳細は、Oracle Database XML Java APIリファレンスを参照してください

図6-1 XSLT Processor for Javaの使用

図6-1の説明が続きます。
「図6-1 XSLT Processor for Javaの使用」の説明

XSLT Processorのデモ・プログラムの実行

XSLT Processor for Javaのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/parser/xsltにあります。表6-1に、XSLT Processorのテストに使用できるXMLファイルとプログラムを示します。

表6-1 XSLT Processorのサンプル・ファイル

ファイル 説明

match.xml

ID選択とパターン・マッチングのテストに使用できるサンプルXML文書。関連付けられているスタイルシートはmatch.xslです。

match.xsl

match.xmlで使用するサンプル・スタイルシート。単純な識別子変換のテストに使用できます。

math.xml

単純な算術の実行に使用できるサンプルXMLデータ文書。関連付けられているスタイルシートはmath.xslです。

math.xsl

math.xmlで使用するサンプル・スタイルシート。スタイルシートは、math.xmlの要素値に対して実行した算術演算の結果とともにHTMLページを出力します。

number.xml

ソース・ツリーのナンバリングのテストに使用できるサンプルXMLデータ文書。このXMLデータ文書は書籍の構造を記述します。

number.xsl

number.xmlで使用するサンプル・スタイルシート。スタイルシートは、number.xmlで記述されている書籍内のセクションのセクション番号を計算するHTMLページを出力します。

position.xml

複合パターンでposition()=Xのテストに使用できるサンプルXMLデータ文書。関連付けられているスタイルシートはposition.xslです。

position.xsl

position.xmlで使用するサンプル・スタイルシート。スタイルシートは、複合パターン・マッチングの結果とともにHTMLページを出力します。

reverse.xml

ツリーを後方検索するためにreverse.xslで使用できるサンプルXMLデータ文書。

reverse.xsl

reverse.xmlで使用するサンプル・スタイルシート。スタイルシートは、reverse.xmlのアイテム番号を逆の順序で出力します。

string.xml

様々な文字列テストと操作のテストに使用できるサンプルXMLデータ文書。関連付けられているスタイルシートはstring.xslです。

string.xsl

string.xmlで使用するサンプル・スタイルシート。スタイルシートは、文字列操作の結果を表示するXML文書を出力します。

style.txt

HTMLページのフレームワークを提供するスタイルシート。スタイルシートはnumber.xslによってインクルードされます。

variable.xml

XSL変数の使用のテストに使用できるサンプルXMLデータ文書。このXMLデータ文書は書籍の構造を記述します。関連付けられているスタイルシートはvariable.xslです。

variable.xsl

variable.xmlで使用するスタイルシート。スタイルシートは、XSL変数を広範に使用します。

XSLSample.java

Oracle XSLT ProcessorのXSL処理機能の使用方法を簡単な例で示すサンプル・アプリケーション。このプログラムは、入力スタイルシートを使用して入力XML文書を変換します。このプログラムは、XSL変換の結果をDocumentFragmentとして構築し、xsl:output機能を表示しません。

ディレクトリ内の任意のXSLTスタイルシートを最初の引数として使用し、関連付けられている*.xml XML文書を第2引数として使用して、このプログラムを実行します。たとえば、variable.xslvariable.xml、またはstring.xslstring.xmlを指定してプログラムを実行します。

XSLSample2.java

Oracle XSLT ProcessorのXSL処理機能の使用方法を簡単な例で示すサンプル・アプリケーション。このプログラムは、入力スタイルシートを使用して入力XML文書を変換します。このプログラムは、結果をストリームに出力し、xsl:output機能をサポートします。XSLSample.javaと同様に、ディレクトリ内のXMLデータ文書とスタイルシートの任意のペアに対してこのプログラムを実行できます。


サンプル・プログラムのコンパイル方法および実行方法は、READMEに示されています。基本手順は次のとおりです。

  1. ディレクトリを$ORACLE_HOME/xdk/demo/java/parser/xsltディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\parser\xsltディレクトリ(Windowsの場合)に変更します。

  2. 「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。

  3. コマンドラインでmake(UNIXの場合)またはMake.bat(Windowsの場合)を実行します。makeファイルはソース・コードをコンパイルしてから、各*.xmlファイルおよび関連付けられている*.xslスタイルシートに対してXSLSampleおよびXSLSample2プログラムを実行します。プログラムは、各変換の出力を*.outに書き込みます。

  4. *.outファイルを表示して、XML変換の出力を参照できます。次のようにコマンドラインでプログラムを実行することもできます。namematchmathなどで置き換えます。

    java XSLSample name.xsl name.xml
    java XSLSample2 name.xsl name.xml
    

    たとえば、match.xmlデモは次のように実行します。

    java XSLSample match.xsl match.xml
    java XSLSample2 match.xsl match.xml
    

XSLT Processorコマンドライン・ユーティリティの使用

XDKには、複数のXML文書にスタイルシートを適用できるコマンドラインJavaインタフェースであるoraxslが含まれています。$ORACLE_HOME/bin/oraxslおよび%ORACLE_HOME%\bin\oraxsl.batシェル・スクリプトは、oracle.xml.jaxb.oraxslクラスを実行します。oraxslを使用するには、CLASSPATH「Java XDK環境の設定」の説明に従って設定されていることを確認します。

コマンドラインで次の構文を使用して、oraxslを起動します。

oraxsl options source stylesheet result

oraxslユーティリティには、スタイルシート、変換するXMLファイルおよび結果ファイル(オプション)を指定します。結果ファイルを指定しない場合、ユーティリティは変換した文書を標準出力に送信します。複数のXML文書をスタイルシートによって変換する必要がある場合は、-lまたは-dオプションを-sおよび-rオプションと組み合せて使用します。表6-2に、これらのオプションおよび他のオプションを示します。

表6-2 oraxslのコマンドライン・オプション

オプション 説明

-w

警告を表示します。デフォルトでは、警告はオフになっています。

-e error_log

プログラムがエラーおよび警告を書き込むファイルを指定します。

-l xml_file_list

処理するファイルをリストします。

-d directory

変換するファイルが格納されているディレクトリを指定します。デフォルトの動作では、ディレクトリ内のすべてのファイルが処理されます。そのディレクトリ内にあるファイルのサブセットのみ(1つのファイルのみなど)を処理する必要がある場合は、-lを設定して処理する必要のあるファイルを指定し、この動作を変更します。-xまたは-iを使用して拡張子に基づいてファイルを選択することで、この動作を変更することもできます。

-x source_extension

除外する必要のあるファイルの拡張子を指定します。このオプションは-dとともに使用します。プログラムは、指定された拡張子の付いたファイルを選択しません。

-i source_extension

含める必要のあるファイルの拡張子を指定します。このオプションは-dとともに使用します。プログラムは、指定された拡張子の付いたファイルのみ選択します。

-s stylesheet

スタイルシートを指定します。-dまたは-lを設定した場合は、-sを設定して使用するスタイルシートを示します。完全なパスを指定する必要があります。

-r result_extension

結果に使用する拡張子を指定します。-dまたは-lを設定した場合は、-rを設定して変換の結果に使用する拡張子を指定します。このため、拡張子outを指定した場合、プログラムは入力文書docdoc.outに変換します。デフォルトでは、プログラムは結果を現在のディレクトリに出力します。この動作は、結果を保存するディレクトリを指定する-oオプションを使用して変更できます。

-o result_directory

結果を保存するディレクトリを指定します。このオプションは、-rオプションと組み合せて設定する必要があります。

-p param_list

パラメータをリストします。

-t num_of_threads

処理に使用するスレッド数を指定します。複数のスレッドを使用すると、複数の文書を処理する際のパフォーマンスを向上させることができます。

-v

冗長出力を生成します。プログラムは、デバッグ情報を出力します。この出力は、処理中に発生した問題の追跡に有効な場合があります。

-debug

デバッグ出力を生成します。デフォルトでは、デバッグ・モードは無効になっています。XSLTデバッガのGUIバージョンは、Oracle JDeveloperで使用できます。


XSLT Processorコマンドライン・ユーティリティの使用: 例

$ORACLE_HOME/xdk/demo/java/parser/xsltにある様々なXMLファイルおよびスタイルシートでoraxslをテストできます。例6-1に、math.xmlのコンテンツを示します。

例6-1 math.xml

<?xml version="1.0"?>
<doc>
  <n1>5</n1>
  <n2>2</n2>
  <div>-5</div>
  <mod>2</mod>
</doc>

例6-2に、math.xslというXSLTスタイルシートを示します。

例6-2 math.xsl

<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="doc">
    <HTML>
      <H1>Test for mod.</H1>
      <HR/>
      <P>Should say "1": <xsl:value-of select="5 mod 2"/></P>
      <P>Should say "1": <xsl:value-of select="n1 mod n2"/></P>
      <P>Should say "-1": <xsl:value-of select="div mod mod"/></P>
      <P><xsl:value-of select="div or ((mod)) | or"/></P>
    </HTML>
  </xsl:template>
</xsl:stylesheet

これらのファイルに対してoraxslユーティリティを実行して、次の例に示すHTML出力を生成できます。

oraxsl math.xml math.xsl math.htm

例6-3に、出力ファイルmath.htmを示します。

例6-3 math.htm

<HTML>
   <H1>Test for mod.</H1>
   <HR>
   <P>Should say "1": 1</P>
   <P>Should say "1": 1</P>
   <P>Should say "-1": -1</P>
   <P>true</P>
</HTML>

XMLの変換

この項の内容は次のとおりです。

基本的なXSL変換の実行

「XSLT Processor for Javaの使用: 概要」で説明したように、XSLT Processorで使用される基本的なクラスはDOMParserおよびXSLProcessorです。XSL2Sample.javaデモ・プログラムは、これらのクラスを使用してXSLTスタイルシートでXML文書を変換する方法をわかりやすく示します。

次の基本手順を使用して、XSLT Processorを使用するJavaプログラムを作成します。

  1. XMLデータ文書とXSLTスタイルシートの解析に使用できるDOMパーサー・オブジェクトを作成します。XSL2Sample.javaの次のコード部分は、パーサーをインスタンス化する方法を示します。

    XMLDocument xml, xsldoc, out;URL xslURL;URL xmlURL;
    // ... 
    parser = new DOMParser();parser.setPreserveWhitespace(true);
    

    デフォルトでは、DTDが使用されていないかぎりパーサーは空白を保持しないことに注意してください。空白を保持するとXSLTの空白ルールで空白の処理方法を決定できるため、空白の保持は重要です。

  2. DOMParser.parse()メソッドを使用してXSLTスタイルシートを解析します。XSL2Sample.javaの次のコード部分は、解析の実行方法を示します。

    xslURL = DemoUtil.createURL(args[0]);
    parser.parse(xslURL);
    xsldoc = parser.getDocument();
    
  3. DOMParser.parse()メソッドを使用してXMLデータ文書を解析します。XSL2Sample.javaの次のコード部分は、解析の実行方法を示します。

    xmlURL = DemoUtil.createURL(args[1]);
    parser.parse(xmlURL);
    xml = parser.getDocument();
    
  4. 新規XSLTスタイルシート・オブジェクトを作成します。次のクラスのオブジェクトをXSLProcessor.newXSLStylesheet()メソッドに渡すことができます。

    • java.io.Reader

    • java.io.InputStream

    • XMLDocument

    • java.net.URL

    たとえば、XSL2Sample.javaは、XMLDocumentオブジェクトからスタイルシートを作成する方法を示します。

    XSLProcessor processor = new XSLProcessor();
    processor.setBaseURL(xslURL);
    XSLStylesheet xsl = processor.newXSLStylesheet(xsldoc);
    
  5. 警告を表示するようにXSLT Processorを設定します。たとえば、XSL2Sample.javaは次のようにshowWarnings()およびsetErrorStream()メソッドをコールします。

    processor.showWarnings(true);
    processor.setErrorStream(System.err);
    
  6. XSLProcessor.processXSL()メソッドを使用して、スタイルシートを入力XMLデータ文書に適用します。表6-3に、他の使用可能なXSLProcessorメソッドの一部を示します。

    表6-3 XSLProcessorのメソッド

    メソッド 説明

    removeParam()

    パラメータを削除します。

    resetParams()

    すべてのパラメータをリセットします。

    setParam()

    変換用のパラメータを設定します。

    setBaseUrl()

    スタイルシート内の相対参照のベースURLを設定します。

    setEntityResolver()

    スタイルシート内の相対参照のエンティティ・リゾルバを設定します。

    setLocale()

    エラー・レポートのロケールを設定します。


    XSL2Sample.javaの次のコード部分は、スタイルシートをXML文書に適用する方法を示します。

    processor.processXSL(xsl, xml, System.out);
    
  7. 変換した出力を処理します。XML文書オブジェクトの作成、出力ストリームの書出しまたはSAXイベントの報告によって、結果を変換できます。

    XSL2Sample.javaの次のコード部分は、結果を出力する方法を示します。

    processor.processXSL(xsl, xml, System.out);
    

XSL変換からのDOM結果の取得

XSLSample.javaデモ・プログラムは、XSL変換の結果としてoracle.xml.parser.v2.XMLDocumentFragmentオブジェクトを生成する方法を示します。XMLDocumentFragmentはXML文書ツリーの一部を抽出する軽量Documentオブジェクトです。XMLDocumentFragmentクラスは、org.w3c.dom.DocumentFragmentインタフェースを実装します。

XSL2Sample.javaプログラムは、DocumentFragmentオブジェクトの生成方法を示します。XMLの変換の基本手順は、「基本的なXSL変換の実行」で説明した手順と同じです。XSLProcessor.processXSL()メソッドに渡される引数のみ異なります。XSL2Sample.javaの次のコード部分は、DOMフラグメントを作成して標準出力に出力する方法を示します。

XMLDocumentFragment result = processor.processXSL(xsl, xml);
result.print(System.out);

表6-4に、オブジェクトの操作に使用できるXMLDocumentFragmentメソッドの一部を示します。

表6-4 XMLDocumentFragmentのメソッド

メソッド 説明

getAttributes()

このノードがElementである場合はその属性を含むNamedNodeMapを取得し、Elementでない場合はnullを生成します。

getLocalName()

この要素のローカル名を取得します。

getNamespaceURI()

この要素の名前空間URIを取得します。

getNextSibling()

現在のノードの直後のノードを取得します。

getNodeName()

ノードの名前を取得します。

getNodeType()

基礎となるオブジェクトの型を表すコードを取得します。

getParentNode()

現在のノードの親を取得します。

getPreviousSibling()

現在のノードの直前のノードを取得します。

reportSAXEvents()

DOMツリーからSAXイベントを報告します。


Oracle XSLT拡張によるプログラミング

この項の内容は次のとおりです。

Oracle XSLT拡張の概要

XSLT 1.0標準では、拡張要素および拡張関数という2種類の拡張を定義しています。XDKに提供されているXSLT処理用の拡張関数を使用すると、XSLT Processorのユーザーは、任意のJavaメソッドをXSLの式からコールできます。Oracle XSLT拡張を使用する場合のガイドラインを次に示します。

  • 特定のプログラミング言語でXSLT拡張を定義する場合、この拡張を起動できるXSLT ProcessorでのみXSLTスタイルシートを使用できます。したがって、Javaで定義されている拡張関数を起動できるのは、JavaバージョンのXSLT Processorのみです。

  • 組込みXSL関数で特定の問題を解決できない場合のみ、XSLT拡張を使用します。

  • 次の項で説明するように、拡張クラスの名前空間は適切なURLから開始する必要があります。

次のOracle拡張関数は特に便利です。

  • <ora:output><ora:output>は、最上位レベルの要素として、またはXSLテンプレートで使用できます。最上位レベルの要素として使用する場合は、追加のname属性がある点を除いて<xsl:output>拡張関数と同様です。テンプレートとして使用されている場合は、追加属性useおよびhrefがあります。この関数は、1つのXSL変換から複数の出力を作成するときに役立ちます。

  • <ora:node-set>。結果ツリーのフラグメントをnode-setに変換します。この関数は、XSL内の既存のテキストまたは中間テキストの結果を参照してさらに変換する必要がある場合に役立ちます。

XSLT拡張関数の名前空間の指定

Oracle Javaの拡張関数は、次のURIに対応する名前空間にあります。

http://www.oracle.com/XSL/Transform/java/

次の名前空間にある拡張関数は、次の形式でURIを作成できるようにJava classnameのメソッドを参照します。

http://www.oracle.com/XSL/Transform/java/classname

たとえば、次の名前空間を使用して、XSLの式からjava.lang.Stringメソッドをコールできます。

http://www.oracle.com/XSL/Transform/java/java.lang.String

注意:

xsl接頭辞を名前空間に割り当てる場合、適切なURIはxmlns:xsl="http://www.w3.org/1999/XSL/Transform"です。その他のURIでは正しい出力を生成できません。

XSLTでのstaticおよび非static Javaメソッドの使用

Javaメソッドがクラスの非staticメソッドの場合、最初のパラメータはメソッドが起動されるインスタンスとして使用され、残りのパラメータがメソッドに渡されます。ただし、拡張関数がstaticメソッドの場合、その拡張関数のすべてのパラメータが、静的関数へのパラメータとして渡されます。例6-4に、XSLTスタイルシートでのjava.lang.Math.ceil()メソッドの使用例を示します。

例6-4 XSLTスタイルシートでの静的関数の使用

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:math="http://www.oracle.com/XSL/Transform/java/java.lang.Math"> 
  <xsl:template match="/"> 
    <xsl:value-of select="math:ceil('12.34')"/> 
  </xsl:template> 
</xsl:stylesheet> 

たとえば、例6-4をスタイルシートceil.xslとして作成し、任意の整形式XML文書に適用できます。たとえば、次のようにoraxslユーティリティを実行します。

oraxsl ceil.xsl ceil.xsl ceil.out

出力文書ceil.outのコンテンツは次のとおりです。

<?xml version = '1.0' encoding = 'UTF-8'?>
13

注意:

XSLクラス・ローダーは、静的に追加されたJARおよびwrapper.classpathによって指定されたCLASSPATHのパスのみ認識します。動的に追加されたファイルはXSLT Processorで認識されません。

コンストラクタ拡張関数の使用

拡張関数newは、クラスの新しいインスタンスを作成し、コンストラクタとして動作します。例6-5では、"Hello World"という値を持つ新しいStringオブジェクトを作成し、それをXSL変数str1に格納し、大文字で出力します。

例6-5 XSLTスタイルシートでのコンストラクタの使用

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:jstring="http://www.oracle.com/XSL/Transform/java/java.lang.String"> 
  <xsl:template match="/"> 
    <!-- creates a new java.lang.String and stores it in the variable str1 --> 
    <xsl:variable name="str1" select="jstring:new('HeLlO wOrLd')"/> 
    <xsl:value-of select="jstring:toUpperCase($str1)"/> 
  </xsl:template> 
</xsl:stylesheet>

たとえば、このスタイルシートをhello.xslとして作成し、任意の整形式XML文書に適用できます。たとえば、次のようにoraxslユーティリティを実行します。

oraxsl hello.xsl hello.xsl hello.out

出力文書hello.outのコンテンツは次のとおりです。

<?xml version = '1.0' encoding = 'UTF-8'?>
HELLO WORLD

戻り値拡張関数の使用

拡張関数の結果は、XSLに定義されている次の5つの型、およびXSLT 2.0で定義されている単純なXML Schemaデータ型を含むどの型でも出力できます。

  • NodeSet

  • Boolean

  • String

  • Number

  • ResultTree

これらのデータ型は、変数に格納したり、他の拡張関数に渡したりできます。結果の型がXSLに定義されている5つの型のうちの1つである場合、その結果はXSLの式の結果として戻すことができます。

XSLT Processorは、パラメータ数と型に基づくオーバーロードをサポートします。プロセッサは、XSLに定義されたとおりに5つのXSL型の間で暗黙的な型変換を実行します。次のデータ型間で型変換を暗黙的に実行します。また、NodeSetから次のデータ型にも変換します。

  • String

  • Number

  • Boolean

  • ResultTree

相互に暗黙的な変換が可能な2つの型に基づくオーバーロードは許可されません。次のオーバーロードでは、StringおよびNumberは相互に暗黙的な変換が可能なため、XSLでエラーが発生します。

  • overloadme(int i){}

  • overloadme(String s){}

XSLデータ型とJavaデータ型間のマッピングは次のとおり行われます。

String     ->     java.lang.String
Number     ->     int, float, double
Boolean    ->     boolean
NodeSet    ->     NodeList
ResultTree ->     XMLDocumentFragment

例6-6のスタイルシートは、$ORACLE_HOME/xdk/demo/java/parser/xsltディレクトリにあるvariable.xml文書を解析し、<chapter>要素の子である<title>の値を取得します。

例6-6 gettitle.xsl

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:parser = "http://www.oracle.com/XSL/Transform/java/oracle.xml.parser.v2.DOMParser"
  xmlns:document =
    "http://www.oracle.com/XSL/Transform/java/oracle.xml.parser.v2.XMLDocument"> 

  <xsl:template match ="/"> 
    <!-- Create a new instance of the parser and store it in myparser variable --> 
    <xsl:variable name="myparser" select="parser:new()"/> 

    <!-- Call an instance method of DOMParser. The first parameter is the object.
     The PI is equivalent to $myparser.parse('file:/my_path/variable.xml'). Note
     that you should replace my_path with the absolute path on your system. --> 
    <xsl:value-of select="parser:parse($myparser, 'file:/my_path/variable.xml')"/> 

    <!-- Get the document node of the XML Dom tree --> 
    <xsl:variable name="mydocument" select="parser:getDocument($myparser)"/>

    <!-- Invoke getelementsbytagname on mydocument --> 
    <xsl:for-each select="document:getElementsByTagName($mydocument,'chapter')">
      The value of the title element is: <xsl:value-of select="docinfo/title" />
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

例6-6gettitle.xslとして作成し、次のようにoraxslを実行できます。

oraxsl gettitle.xsl gettitle.xsl variable.out

出力文書variable.outのコンテンツは次のとおりです。

<?xml version = '1.0' encoding = 'UTF-8'?>
The value of the title element is: Section Tests

XML変換のヒントと方法

この項では、XSLおよびXSLT Processor for Javaについてのヒントを示します。次の内容が含まれます。

XML文書とXSLTのマージ

「appendChild()を使用した文書のマージ」では、DOMでの文書のマージ方法について説明しています。マージ操作が単純な場合、XSLTベースの方法も使用できます。例6-7および例6-8のXML文書をマージすると想定します。

例6-7 msg_w_num.xml

<messages>
  <msg>
    <key>AAA</key>
    <num>01001</num>
  </msg>
  <msg>
    <key>BBB</key>
    <num>01011</num>
  </msg>
</messages>

例6-8 msg_w_text.xml

<messages>
  <msg>
    <key>AAA</key>
    <text>This is a Message</text>
  </msg>
  <msg>
    <key>BBB</key>
    <text>This is another Message</text>
  </msg>
</messages>

例6-9に、一致する<key/>要素値に基づいて、2つのXML文書をマージするサンプル・スタイルシートを示します。

例6-9 msgmerge.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <!-- store msg_w_text.xml in doc2 variable -->
  <xsl:variable name="doc2" select="document('msg_w_text.xml')"/>
  
  <!-- match each node in input xml document, that is, msg_w_num.xml -->
  <xsl:template match="@*|node()">
     <!-- copy the current node to the result tree -->
     <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
  </xsl:template>

  <!-- match each <msg> element in msg_w_num.xml -->
  <xsl:template match="msg">
     <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <!-- insert two spaces so indentation is correct in output document -->
        <xsl:text>  </xsl:text> 
        <!-- copy <text> node from msg_w_text.xml into result tree -->
        <text><xsl:value-of 
               select="$doc2/messages/msg[key=current()/key]/text"/>
        </text>
     </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

例6-7例6-8および例6-9でXMLファイルを作成し、コマンドラインで次のコマンドを実行します。

oraxsl msg_w_num.xml msgmerge.xsl msgmerge.xml

例6-10に、出力文書を示します。この文書は、msg_w_num.xmlおよびmsg_w_text.xmlに含まれるデータをマージします。

例6-10 msgmerge.xml

<?xml version = '1.0' encoding = 'UTF-8'?>
<messages>
  <msg>
    <key>AAA</key>
    <num>01001</num>
    <text>This is a Message</text>
   </msg>
  <msg>
    <key>BBB</key>
    <num>01011</num>
    <text>This is another Message</text>
   </msg>
</messages>

この方法は、サイズが大きいファイルの場合は、2つの表間での同等のデータベースの結合ほど効果的ではありませんが、XMLファイルのみを処理する場合は有用です。

表の列に基づくHTML入力フォームの作成

データベース表の列名を使用する入力データに対してHTMLフォームを生成する必要があるとします。この目的は、XSUを使用してuser_tab_columns表に基づくXML文書を取得し、XSLTを使用してXMLをHTMLフォームに変換することによって達成できます。

  1. XSUを使用して、表の列に基づいてXML文書を生成します。たとえば、表がhr.employeesであるとします。XSUは次のようにコマンドラインから実行できます。

    java OracleXML getXML -user "hr/password"\
     "SELECT column_name FROM user_tab_columns WHERE table_name = 'EMPLOYEES'"
    
  2. XSU出力を、emp_columns.xmlというXMLファイルとして保存します。XMLは次のようになります。1つの<ROW>要素が表の各列に対応します(一部の<ROW>要素はスペース節約のために削除されています)。

    <?xml version = '1.0'?><ROWSET>
       <ROW num="1">
          <COLUMN_NAME>EMPLOYEE_ID</COLUMN_NAME>
       </ROW>
       <ROW num="2">
          <COLUMN_NAME>FIRST_NAME</COLUMN_NAME>
       </ROW>
       <!-- rows 3 through 10 -->
       <ROW num="11">
          <COLUMN_NAME>DEPARTMENT_ID</COLUMN_NAME>
       </ROW>
    </ROWSET>
    
  3. XMLをHTMLに変換するスタイルシートを作成します。たとえば、columns.xslスタイルシートを次のように作成します。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html"/>
      <xsl:template match="/">
        <HTML>
          <xsl:apply-templates select="@*|node()"/>
        </HTML>
      </xsl:template>
      <xsl:template match="ROW">
        <xsl:value-of select="COLUMN_NAME"/>
        <xsl:text>&nbsp;</xsl:text>
        <INPUT NAME="{COLUMN_NAME}"/>
        <BR/>
      </xsl:template>
    </xsl:stylesheet>
    
  4. oraxslユーティリティを実行してHTMLフォームを生成します。次に例を示します。

    oraxsl emp_columns.xml columns.xsl emp_form.htm
    
  5. 出力HTMLフォームを確認します。このフォームのコンテンツは次のようになります。

    <HTML>
       EMPLOYEE_ID&nbsp;<INPUT NAME="EMPLOYEE_ID"><BR>
       FIRST_NAME&nbsp;<INPUT NAME="FIRST_NAME"><BR>
       LAST_NAME&nbsp;<INPUT NAME="LAST_NAME"><BR>
       EMAIL&nbsp;<INPUT NAME="EMAIL"><BR>
       PHONE_NUMBER&nbsp;<INPUT NAME="PHONE_NUMBER"><BR>
       HIRE_DATE&nbsp;<INPUT NAME="HIRE_DATE"><BR>
       JOB_ID&nbsp;<INPUT NAME="JOB_ID"><BR>
       SALARY&nbsp;<INPUT NAME="SALARY"><BR>
       COMMISSION_PCT&nbsp;<INPUT NAME="COMMISSION_PCT"><BR>
       MANAGER_ID&nbsp;<INPUT NAME="MANAGER_ID"><BR>
       DEPARTMENT_ID&nbsp;<INPUT NAME="DEPARTMENT_ID"><BR>
    </HTML>