この章では、Extensible Stylesheet Language Transformation (XSLT)およびXSLT Virtual Machine (XVM) Processor for Cの使用方法について説明します。
内容は次のとおりです。
注意:
Oracle XML Developer's Kit (XDK)およびOracle XML DBアプリケーションには、統合Cアプリケーション・プログラミング・インタフェース(API)を使用します。非統合の旧C関数は非推奨で、下位互換性のためにのみサポートされています。これは、将来のリリースでは削除される予定です。
統合C APIの詳細は、「XML Parser for Cの使用」を参照してください。
Oracle XVMパッケージには、XSLTコンパイラおよびXVMが含まれます。このパッケージは、1999年11月16日のWorld Wide Web Consortium (W3C)勧告で指定されているとおりにXSLT言語を実装します。
XSLTコンパイラおよびXVMを実装すると、XSLT (バージョン1.0)をバイトコード形式でコンパイルできるようになります。XVMは、コンパイル済のXSLTコードを実行するよう設計されたCPUのソフトウェアによる実装です。この仮想マシンでは、一連のバイトコードまたは「XSLT CPU」の機械命令にXSLTスタイルシートをコンパイルするコンパイラを想定します。バイトコード・プログラムは、プラットフォームに依存しない2バイト単位のシーケンスです。異なるXVM上で格納、キャッシュおよび実行することが可能です。XVMでは、バイトコード・プログラムを使用してExtensible Markup Language (XML)インスタンス・ドキュメントを変換します。このため、コンパイル時の計算と実行時の計算は明確に区別され、命令間でのデータ交換には決まった方法が指定されます。
この方法のメリットは次のとおりです。
異なるプラットフォーム上でも、XSLTスタイルシートをコンパイルしたり、1つのファイルに保存したり、頻繁に再利用することができます。
XVMは他のXSLTプロセッサに比べて著しく高速であり、使用するメモリーは少ないです。
バイトコードは言語に依存しません。そのため、CまたはC++のXSLTコンパイラで生成されたコードに違いはありません。
APIパッケージを使用する一般的な場面には、次の手順が含まれます。
XMLメタコンテキスト・オブジェクトを作成して使用します。
xctx = XmlCreate(&err,...);
XSLTコンパイラ・オブジェクトを作成して使用します。
comp = XmlXvmCreateComp(xctx);
XSLTスタイルシートまたはXPath式をコンパイルし、結果として戻るバイトコードを格納またはキャッシュします。
code = XmlXvmCompileFile(comp, xslFile, baseuri, flags, &err);
または
code = XmlXvmCompileDom (comp, xslDomdoc, flags, &err);
または
code = XmlXvmCompileXPath (comp, xpathexp, namespaces, &err);
XVMオブジェクトを作成して使用します。XVMが「スタックがオーバーフローしました」のメッセージで終了するとき、または必要とするメモリー・フットプリントがより少ないときは、スタック・サイズを明示的に設定する必要があります。XmlXvmCreate()
を参照してください。
vm = XmlXvmCreate(xctx, "StringStack", 32, "NodeStack", 24, NULL);
出力を設定します(オプション)。デフォルトはストリームです。
err = XmlXvmSetOutputDom (vm, NULL);
または
err = XmlXvmSetOutputStream(vm, &xvm_stream);
または
err = XmlXvmSetOutputSax(vm, &xvm_callback, NULL);
スタイルシートのバイトコードをXVMオブジェクトに設定します。他のバイトコードを使用して繰り返すことができます。
len = XmlXvmGetBytecodeLength(code, &err); err = XmlXvmSetBytecodeBuffer(vm, code, len);
または
err = XmlXvmSetBytecodeFile (vm, xslBytecodeFile);
XMLインスタンス・ドキュメントを変換するか、コンパイルしたXPath式を評価します。同じXML文書または他のXML文書を使用して繰り返すことができます。
err = XmlXvmTransformFile(vm, xmlFile, baseuri);
または
err = XmlXvmTransformDom (vm, xmlDomdoc);
または
obj = (xvmobj*)XmlXvmEvaluateXPath (vm, code, 1, 1, node);
出力ツリー・フラグメントを取得します(手順5でDOM出力が設定されている場合)。
node = XmlXvmGetOutputDom (vm);
オブジェクトを削除します。
XmlXvmDestroy(vm); XmlXvmDestroyComp(comp); XmlDestroy(xctx);
次の方法で、コマンドラインからXVMプロセッサにアクセスします。
xvm
使用方法
xvm options xslfile xmlfile
xvm options xpath xmlfile
オプション
-c Compile xslfile. The bytecode is in "xmlfile.xvm". -ct Compile xslfile and transform xmlfile. -t Transform xmlfile using bytecode from xslfile. -xc Compile xpath. The bytecode is in "code.xvm". -xct Compile and evaluate xpath with xmlfile. -xt Evaluate XPath bytecode from xpath with xmlfile.
例
xvm -ct db.xsl db.xml xvm -t db.xvm db.xml xvm -xct "doc/employee[15]/family" db.xml
Oracle XVM Processor for Cは、Oracle Databaseの標準インストールに含まれています。
関連項目:
『Oracle Database XML C APIリファレンス』の「C用のXSLTVM APIパッケージ」
http://www.oracle.com/technetwork/database-features/xdk/overview/index.html
Oracle XSL/XPathパッケージは、1999年11月16日のW3C勧告で指定されたとおりにXSLT言語を実装します。このパッケージには、XSLTプロセッサおよびXPathプロセッサが含まれます。より一般的な設計方法に従い、OracleによってXSLTプロセッサが実装されます。この方法では、コンパイラとプロセッサが1つのオブジェクトに融合されています。
APIパッケージを使用する一般的な場面には、次の手順が含まれます。
XMLメタコンテキスト・オブジェクトを作成して使用します。
xctx = XmlCreate(&err,...);
XSLTスタイルシートを解析します。
xslDomdoc = XmlLoadDom(xctx, &err, "file", xslFile, "base_uri", baseuri, NULL);
スタイルシート用のXSLTプロセッサを作成します。
xslproc = XmlXslCreate (xctx, xslDomdoc, baseuri, &err);
XMLインスタンス・ドキュメントを解析します。
xmlDomdoc = XmlLoadDom(xctx, &err, "file", xmlFile, "base_uri", baseuri, NULL);
出力を設定します(オプション)。デフォルトはDocument Object Model (DOM)です。
err = XmlXslSetOutputStream(xslproc, &stream);
XML文書を変換します。この手順は、同じXML文書または他のXML文書を使用して繰り返すことができます。
err = XmlXslProcess (xslproc, xmlDomdoc, FALSE);
出力を取得します(DOMの場合)。
node = XmlXslGetOutput(xslproc);
オブジェクトを削除します。
XmlXslDestroy(xslproc); XmlDestroy(xctx);
APIパッケージを使用する一般的な場面には、次の手順が含まれます。
XMLメタコンテキスト・オブジェクトを作成して使用します。
xctx = XmlCreate(&err,...);
XML文書を解析するか、既存のDOMから現行のノードを取得します。
node = XmlLoadDom(xctx, &err, "file", xmlFile, "base_uri", baseuri, NULL);
XPathプロセッサを作成します。
xptproc = XmlXPathCreateCtx(xctx, NULL, node, 0, NULL);
XPath式を解析します。
exp = XmlXPathParse (xptproc, xpathexpr, &err);
XPath式を評価します。
obj = XmlXPathEval(xptproc, exp, &err);
オブジェクトを削除します。
XmlXPathDestroyCtx (xptproc); XmlDestroy(xctx);
C Oracle XSLT Processorは、次のようにbin/xsl:
をコールすることによって、実行可能ファイルとしてコールできます。
xsl [switches] stylesheet instance or xsl -f [switches] [document filespec]
スタイルシートが指定されないと、出力は生成されません。スタイルシートはあるが出力ファイルがない場合は、出力はstdout
となります。
表19-1に、コマンドライン・オプションを示します。
表19-1 XSLT Processor for C: コマンドライン・オプション
オプション | 説明 |
---|---|
-B BaseUri
|
XSLTプロセッサ用のベースURIを設定します。 |
-e encoding
|
デフォルトの入力ファイルのエンコーディングを指定します( |
-E encoding
|
DOMまたはSimple API for XML (SAX)エンコーディングを指定します。 |
-f |
ファイル: Universal Resource Identifier (URI)ではなく、ファイル指定として解釈します。 |
-G xptrexprs
|
ファイルに指定されたXPointerスキーマの例を評価します。 |
-h |
ヘルプ: この使用方法を示します。(詳細なオプションには |
-hh |
詳細なオプションのリストを表示します。 |
-i n
|
XSLTプロセスを繰り返す回数。 |
-l language
|
エラーを報告する言語。 |
-o XSLoutfile
|
XSLTプロセッサの出力ファイルを指定します。 |
-v |
バージョン: パーサーのバージョンを表示し、終了します。 |
-V var value
|
C XSLTで最上位の変数をテストします。 |
-w |
空白: 空白をすべて保持します。 |
-W |
警告: 警告の後で解析を停止します。 |
Oracle XSLT Processor for Cは、Oracle Databaseの標準インストールに含まれています。
関連項目:
『Oracle Database XML C APIリファレンス』の「C用のXSLT APIパッケージ」
『Oracle Database XML C APIリファレンス』の「C用のXPath APIパッケージ」
http://www.oracle.com/technetwork/database-features/xdk/overview/index.html
$ORACLE_HOME/xdk/demo/c/parser/
ディレクトリには、XSLT for Cの使用方法を示すXMLアプリケーションがあります。
表19-2に、このディレクトリにあるファイルを示します。
表19-2 XSLT for Cのデモ・ファイル
サンプル・ファイル名 | 説明 |
---|---|
|
XSLSampleプログラムのソース |
|
XSLSampleからの予想される出力 |
|
XSLSampleで使用できるXMLファイル |
|
XSLSampleで使用できるスタイルシート |
|
シェークスピアの戯曲のXMLバージョン |
|
XVMおよびコンパイラの使用例。入力として、XMLファイルおよびXSLTスタイルシート・ファイルの2つのファイル名を取ります。 |
|
XVMおよびコンパイラの使用例。入力として、XMLファイル名および |
|
|