6 XSLT Processor for Javaの使用

Extensible Stylesheet Language Transformation (XSLT) Processor for Javaの使用方法について説明します。

トピック:

6.1 XSLT Processorの概要

次のトピックでは、XSLTを使用したXML変換の前提条件、標準と仕様および概要について説明します。

トピック:

6.1.1 XSLT Processor for Javaの使用の前提条件

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

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

6.1.2 XSLT Processor for Javaの標準および仕様

Oracle XML Developer's Kit (XDK)のXSLTプロセッサは、XSLT2.0勧告をサポートしています。

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

6.1.3 XSLT 1.0および2.0でのXML変換

Oracle XML Developer's Kit (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では、最上位レベルのstylesheet要素としてマッピング文字を<xsl:character-map>要素で宣言できます。この要素を使用して、XSLT出力に<>&などの予約文字や無効なXML文字のあるファイルを生成できます。

関連項目:

XSLT 2.0の機能の説明と例はXSL Transformations (XSLT) Version 2.0を参照してください

6.2 XSLT Processor for Javaの使用: 概要

XDK XSLT Processorは、XML文書をXML、HTML、XHTML、プレーン・テキストなどの形式の別のテキストベースの文書に変換します。このプロセッサは、アプリケーション・プログラミング・インタフェース(API)を使用してプログラムから起動することも、コマンドラインから実行することもできます。

XSLT Processorは、次のタスクを実行できます。

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

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

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

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

トピック:

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

XSLT Processor for Javaの基本設計を示します。

図6-1は、このプロセスを示しています。

関連項目:

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

図6-1 XSLT Processor for Javaの使用

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

6.2.2 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. 「XDK for Java環境の設定」の説明に従って、環境変数が設定されていることを確認します
  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

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

XDKには、複数のXML文書にスタイルシートを適用できるコマンドラインJavaインタフェースであるoraxslが含まれています。$ORACLE_HOME/bin/oraxslおよび%ORACLE_HOME%\bin\oraxsl.batシェル・スクリプトは、oracle.xml.jaxb.oraxslクラスを実行します。

oraxslを使用するには、「XDK for Java環境の設定」の説明に従ってCLASSPATHが設定されていることを確認します。

コマンドラインで次の構文を使用して、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

デバッグ出力を生成します。デフォルトでは、デバッグ・モードは無効になっています。グラフィカル・ユーザー・インタフェース(GUI)版のXSLTデバッガは、Oracle JDeveloperで使用できます。

トピック:

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

$ORACLE_HOME/xdk/demo/java/parser/xsltにある様々なXMLファイルおよびスタイルシートでoraxslをテストできます。

例6-1に、math.xmlのコンテンツを示します。

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

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

oraxsl math.xml math.xsl math.htm

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

例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

<?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

例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>

6.3 XMLの変換

このトピックでは、基本的なXSL変換の実行方法および変換からのDOM結果の取得方法について説明します。

トピック:

6.3.1 基本的なXSL変換の実行

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

クラスDOMParserおよびXSLProcessorは、「XSLT Processor for Javaの使用: 概要」で説明されています。

次の基本手順を使用して、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. XSLTスタイルシートをDOMParser.parse()メソッドで解析します。XSL2Sample.javaの次のコード部分は、解析の実行方法を示しています。
    xslURL = DemoUtil.createURL(args[0]);
    parser.parse(xslURL);
    xsldoc = parser.getDocument();
    
  3. XMLデータ文書をDOMParser.parse()メソッドで解析します。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);

関連項目

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

サンプル・プログラムに、XSL変換からの結果を取得する方法を示します。

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イベントを報告します。

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

このトピックでは、概要、拡張関数の名前空間の指定、Javaメソッドの使用、コンストラクタ拡張関数の使用、および戻り値戻り値拡張関数の使用について説明します。

トピック:

6.4.1 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内の既存のテキストまたは中間テキストの結果を参照してさらに変換する必要がある場合に役立ちます。

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

Oracle Java拡張関数は、Universal Resource Identifier (URI) http://www.oracle.com/XSL/Transform/java/に対応する名前空間に属しています。この名前空間に属する拡張関数は、http://www.oracle.com/XSL/Transform/java/classnameの形式でURIを作成できるようにJava classnameのメソッドを参照します。

たとえば、名前空間http://www.oracle.com/XSL/Transform/java/java.lang.Stringを使用して、XSL式からjava.lang.Stringメソッドを起動できます。

注意:

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

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

Javaメソッドがクラスのstaticメソッドの場合、最初のパラメータはメソッドが起動されるインスタンスとして使用され、残りのパラメータがメソッドに渡されます。ただし、拡張関数がstaticメソッドの場合、その拡張関数のすべてのパラメータが、静的関数へのパラメータとして渡されます。

例6-4に、XSLTスタイルシートでのjava.lang.Math.ceil()メソッドの使用例を示します。

たとえば、例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およびCLASSPATHのパス、wrapper.classpathによって指定されたパスのみ認識します。動的に追加されたファイルはXSLT Processorで認識されません。

例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.4 コンストラクタ拡張関数の使用

拡張関数newは、クラスの新しいインスタンスを作成し、コンストラクタとして動作します。

例6-5では、Hello Worldという値を持つ新しいStringオブジェクトを作成し、それをXSL変数str1に格納し、大文字で出力します。

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

oraxsl hello.xsl hello.xsl hello.out

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

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

例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>

6.4.5 戻り値拡張関数の使用

拡張関数の結果は、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-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

例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.5 XML変換のヒントと方法

このトピックでは、XML文書とXSLTのマージ、およびデータベース表の列に基づくHTML入力フォームの作成について説明します。

トピック:

6.5.1 XML文書とXSLTのマージ

次の例に、XSLTを使用してXML文書をマージする方法を示します。

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

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

例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に含まれるデータをマージします。

この方法は、サイズが大きいファイルの場合は、2つの表間での同等のデータベースの結合ほど効果的ではありませんが、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 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-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>

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

データベース表の列名を使用する入力データに対してHTMLフォームを生成するには、XML SQL Utility (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に変換するXSLTスタイルシートを作成します。たとえば、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>