この章の内容は次のとおりです。
この項の内容は次のとおりです。
XSLTは、1つのXML文書を別のテキスト文書に変換するために使用できるXMLベースの言語です。たとえば、XSLTを使用してXMLデータ文書を入力として受け取り、文書の要素値に対して算術計算を実行し、計算結果を示すXHTML文書を生成できます。XSLTでは、XPathはソース・ノード・ツリーの要素をナビゲートおよび処理するために使用されます。XPathは、XML文書をノードから構成されるツリーとしてモデル化します。XPathノード・ツリー内のノードのタイプは、DOMツリー内のノードのタイプに対応します。
この章では、次のW3C標準を十分に理解していると想定します。
eXtensible Stylesheet Language(XSL)およびeXtensible Stylesheet Language Transformation(XSLT): XSLTの概要説明が必要な場合は、「はじめに」の「関連ドキュメント」にあるXMLの資料を参照してください。
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/
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文字のあるファイルを生成できます。
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を使用してスタイルシート・オブジェクトを作成できます。このスタイルシート・オブジェクトを再利用して、スタイルシートを再解析せずに複数の文書を変換できます。
図6-1に、XSLT Processor for Javaの基本設計を示します。
関連項目: XMLParser クラスおよびXSDBuilder クラスの詳細は、『Oracle Database XML Java API Reference』を参照してください。 |
XSLT Processor for Javaのデモ・プログラムは、$ORACLE_HOME/xdk/demo/java/parser/xslt
にあります。表6-1に、XSLT Processorのテストに使用できるXMLファイルとプログラムを示します。
表6-1 XSLT Processorのサンプル・ファイル
ファイル | 説明 |
---|---|
|
ID選択とパターン・マッチングのテストに使用できるサンプルXML文書。関連付けられているスタイルシートは |
|
|
|
単純な算術の実行に使用できるサンプルXMLデータ文書。関連付けられているスタイルシートは |
|
|
|
ソース・ツリーのナンバリングのテストに使用できるサンプルXMLデータ文書。このXMLデータ文書は書籍の構造を記述します。 |
|
|
|
複合パターンで |
|
|
|
ツリーを後方検索するために |
|
|
|
様々な文字列テストと操作のテストに使用できるサンプルXMLデータ文書。関連付けられているスタイルシートは |
|
|
|
HTMLページのフレームワークを提供するスタイルシート。スタイルシートは |
|
XSL変数の使用のテストに使用できるサンプルXMLデータ文書。このXMLデータ文書は書籍の構造を記述します。関連付けられているスタイルシートは |
|
|
|
Oracle XSLT ProcessorのXSL処理機能の使用方法を簡単な例で示すサンプル・アプリケーション。このプログラムは、入力スタイルシートを使用して入力XML文書を変換します。このプログラムは、XSL変換の結果を ディレクトリ内の任意のXSLTスタイルシートを最初の引数として使用し、関連付けられている |
|
Oracle XSLT ProcessorのXSL処理機能の使用方法を簡単な例で示すサンプル・アプリケーション。このプログラムは、入力スタイルシートを使用して入力XML文書を変換します。このプログラムは、結果をストリームに出力し、 |
サンプル・プログラムのコンパイル方法および実行方法は、README
に示されています。基本手順は次のとおりです。
ディレクトリを$ORACLE_HOME/xdk/demo/java/parser/xslt
ディレクトリ(UNIXの場合)または%ORACLE_HOME%\xdk\demo\java\parser\xslt
ディレクトリ(Windowsの場合)に変更します。
「Java XDK環境の設定」の説明に従って、環境変数が設定されていることを確認します。
コマンドラインでmake
(UNIXの場合)またはMake.bat
(Windowsの場合)を実行します。makeファイルはソース・コードをコンパイルしてから、各*.xml
ファイルおよび関連付けられている*.xsl
スタイルシートに対してXSLSample
およびXSLSample2
プログラムを実行します。プログラムは、各変換の出力を*.out
に書き込みます。
*.out
ファイルを表示して、XML変換の出力を参照できます。次のようにコマンドラインでプログラムを実行することもできます。name
はmatch
、math
などで置き換えます。
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
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に、これらのオプションおよび他のオプションを示します。
オプション | 説明 |
---|---|
|
警告を表示します。デフォルトでは、警告はオフになっています。 |
|
プログラムがエラーおよび警告を書き込むファイルを指定します。 |
|
処理するファイルをリストします。 |
|
変換するファイルが格納されているディレクトリを指定します。デフォルトの動作では、ディレクトリ内のすべてのファイルが処理されます。そのディレクトリ内にあるファイルのサブセットのみ(1つのファイルのみなど)を処理する必要がある場合は、 |
|
除外する必要のあるファイルの拡張子を指定します。このオプションは |
|
含める必要のあるファイルの拡張子を指定します。このオプションは |
|
スタイルシートを指定します。 |
|
結果に使用する拡張子を指定します。 |
|
結果を保存するディレクトリを指定します。このオプションは、 |
|
パラメータをリストします。 |
|
処理に使用するスレッド数を指定します。複数のスレッドを使用すると、複数の文書を処理する際のパフォーマンスを向上させることができます。 |
|
冗長出力を生成します。プログラムは、デバッグ情報を出力します。この出力は、処理中に発生した問題の追跡に有効な場合があります。 |
|
デバッグ出力を生成します。デフォルトでは、デバッグ・モードは無効になっています。XSLTデバッガのGUIバージョンは、Oracle JDeveloperで使用できます。 |
$ORACLE_HOME/xdk/demo/java/parser/xslt
にある様々なXMLファイルおよびスタイルシートでoraxsl
をテストできます。例6-1に、math.xml
のコンテンツを示します。
例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
を示します。
この項の内容は次のとおりです。
「XSLT Processor for Javaの使用: 概要」で説明したように、XSLT Processorで使用される基本的なクラスはDOMParser
およびXSLProcessor
です。XSL2Sample.java
デモ・プログラムは、これらのクラスを使用してXSLTスタイルシートでXML文書を変換する方法をわかりやすく示します。
次の基本手順を使用して、XSLT Processorを使用するJavaプログラムを作成します。
XMLデータ文書とXSLTスタイルシートの解析に使用できるDOMパーサー・オブジェクトを作成します。XSL2Sample.java
の次のコード部分は、パーサーをインスタンス化する方法を示します。
XMLDocument xml, xsldoc, out;URL xslURL;URL xmlURL; // ... parser = new DOMParser();parser.setPreserveWhitespace(true);
デフォルトでは、DTDが使用されていないかぎりパーサーは空白を保持しないことに注意してください。空白を保持するとXSLTの空白ルールで空白の処理方法を決定できるため、空白の保持は重要です。
DOMParser.parse()
メソッドを使用してXSLTスタイルシートを解析します。XSL2Sample.java
の次のコード部分は、解析の実行方法を示します。
xslURL = DemoUtil.createURL(args[0]); parser.parse(xslURL); xsldoc = parser.getDocument();
DOMParser.parse()
メソッドを使用してXMLデータ文書を解析します。XSL2Sample.java
の次のコード部分は、解析の実行方法を示します。
xmlURL = DemoUtil.createURL(args[1]); parser.parse(xmlURL); xml = parser.getDocument();
新規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);
警告を表示するようにXSLT Processorを設定します。たとえば、XSL2Sample.java
は次のようにshowWarnings()
およびsetErrorStream()
メソッドをコールします。
processor.showWarnings(true); processor.setErrorStream(System.err);
XSLProcessor.processXSL()
メソッドを使用して、スタイルシートを入力XMLデータ文書に適用します。表6-3に、他の使用可能なXSLProcessor
メソッドの一部を示します。
表6-3 XSLProcessorのメソッド
メソッド | 説明 |
---|---|
|
パラメータを削除します。 |
|
すべてのパラメータをリセットします。 |
|
変換用のパラメータを設定します。 |
|
スタイルシート内の相対参照のベースURLを設定します。 |
|
スタイルシート内の相対参照のエンティティ・リゾルバを設定します。 |
|
エラー・レポートのロケールを設定します。 |
XSL2Sample.java
の次のコード部分は、スタイルシートをXML文書に適用する方法を示します。
processor.processXSL(xsl, xml, System.out);
変換した出力を処理します。XML文書オブジェクトの作成、出力ストリームの書出しまたはSAXイベントの報告によって、結果を変換できます。
XSL2Sample.java
の次のコード部分は、結果を出力する方法を示します。
processor.processXSL(xsl, xml, System.out);
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のメソッド
メソッド | 説明 |
---|---|
|
このノードが |
|
この要素のローカル名を取得します。 |
|
この要素の名前空間URIを取得します。 |
|
現在のノードの直後のノードを取得します。 |
|
ノードの名前を取得します。 |
|
基礎となるオブジェクトの型を表すコードを取得します。 |
|
現在のノードの親を取得します。 |
|
現在のノードの直前のノードを取得します。 |
|
DOMツリーからSAXイベントを報告します。 |
この項の内容は次のとおりです。
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内の既存のテキストまたは中間テキストの結果を参照してさらに変換する必要がある場合に役立ちます。
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では正しい出力を生成できません。 |
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-6をgettitle.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
この項では、XSLおよびXSLT Processor for Javaについてのヒントを示します。次の内容が含まれます。
「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フォームを生成する必要があるとします。この目的は、XSUを使用してuser_tab_columns
表に基づくXML文書を取得し、XSLTを使用してXMLをHTMLフォームに変換することによって達成できます。
XSUを使用して、表の列に基づいてXML文書を生成します。たとえば、表がhr.employees
であるとします。XSUは次のようにコマンドラインから実行できます。
java OracleXML getXML -user "hr/password"\
"SELECT column_name FROM user_tab_columns WHERE table_name = 'EMPLOYEES'"
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>
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> </xsl:text> <INPUT NAME="{COLUMN_NAME}"/> <BR/> </xsl:template> </xsl:stylesheet>
oraxsl
ユーティリティを実行してHTMLフォームを生成します。次に例を示します。
oraxsl emp_columns.xml columns.xsl emp_form.htm
出力HTMLフォームを確認します。このフォームのコンテンツは次のようになります。
<HTML> EMPLOYEE_ID <INPUT NAME="EMPLOYEE_ID"><BR> FIRST_NAME <INPUT NAME="FIRST_NAME"><BR> LAST_NAME <INPUT NAME="LAST_NAME"><BR> EMAIL <INPUT NAME="EMAIL"><BR> PHONE_NUMBER <INPUT NAME="PHONE_NUMBER"><BR> HIRE_DATE <INPUT NAME="HIRE_DATE"><BR> JOB_ID <INPUT NAME="JOB_ID"><BR> SALARY <INPUT NAME="SALARY"><BR> COMMISSION_PCT <INPUT NAME="COMMISSION_PCT"><BR> MANAGER_ID <INPUT NAME="MANAGER_ID"><BR> DEPARTMENT_ID <INPUT NAME="DEPARTMENT_ID"><BR> </HTML>