この章の内容は次のとおりです。
注意: 新規のXDKおよびOracle XML DBアプリケーションには、新規の統合C APIを使用してください。以前のC関数は非推奨です。下位互換性のみを目的としてサポートされていますが、今後は拡張されません。これは、将来のリリースでは削除される予定です。新しいCのAPIの詳細は、第18章「XML Parser for Cの使用」を参照してください。 |
Oracle XVMパッケージでは、1999年11月16日のW3C勧告で指定されたとおりに、XSL Transformation(XSLT)を実装します。このパッケージには、XSLTコンパイラおよびXSLT Virtual Machine(XVM)が含まれます。OracleによってXSLTコンパイラおよびXVMが実装されると、XSLT(バージョン1.0)をバイトコード形式でコンパイルできるようになります。これは、仮想マシンで実行されます。XSLT Virtual Machineは、コンパイルされたXSLTコードを実行するために設計された、「CPU」のソフトウェア実装です。この仮想マシンでは、一連のバイトコードまたは「XSLT CPU」の機械命令にXSLTスタイルシートをコンパイルするコンパイラを想定します。バイトコード・プログラムは、プラットフォームに依存しない2バイト単位のシーケンスです。このプログラムは、異なるXVM上で格納、キャッシュおよび実行することが可能です。XVMでは、バイトコード・プログラムを使用して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 XSL/XPathパッケージでは、1999年11月16日のW3C勧告で指定されたとおりに、XSL Transformation(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);
出力を設定します(オプション)。デフォルトは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
となります。
表17-1に、コマンドライン・オプションを示します。
表17-1 XSLT Processor for C: コマンドライン・オプション
オプション | 説明 |
---|---|
-B BaseUri
|
XSLTプロセッサ用のベースURIを設定します。 |
-e encoding
|
デフォルトの入力ファイルのエンコーディングを指定します( |
-E encoding
|
DOMまたはSAXエンコーディングを指定します。 |
-f |
ファイル: URIではなくfilespecを解析します。 |
-G xptrexprs
|
ファイルに指定されたXPointerスキーマの例を評価します。 |
-h |
ヘルプ: 使用方法を表示します。(詳細なオプションには |
-hh |
詳細なオプションのリストを表示します。 |
-i n
|
XSLTプロセスを繰り返す回数。 |
-l language
|
エラーを報告する言語。 |
-o XSLoutfile
|
XSLTプロセッサの出力ファイルを指定します。 |
-v |
バージョン: パーサーのバージョンを表示し、終了します。 |
-V var value
|
C XSLTで最上位の変数をテストします。 |
-w |
空白: すべての空白を保持します。 |
-W |
警告: 警告の後で解析を停止します。 |
$ORACLE_HOME/xdk/demo/c/parser/
ディレクトリには、XSLT for Cの使用方法を示すXMLアプリケーションがあります。
表17-2に、このディレクトリにあるファイルを示します。
表17-2 XSLT for Cのデモ・ファイル
サンプル・ファイル名 | 説明 |
---|---|
|
SAXSampleプログラムのソース |
|
XSLSampleからの予想される出力 |
|
XSLSampleで使用できるXMLファイル |
|
XSLSampleで使用できるスタイルシート |
|
シェークスピアの戯曲のXMLバージョン |
|
XSLT Virtual Machineおよびコンパイラの使用例。入力として、XMLファイルおよびXSLTスタイルシート・ファイルの2つのファイル名を取ります。 |
|
XSLT Virtual Machineおよびコンパイラの使用例。入力として、XMLファイル名および |
|
|