この章の内容は次のとおりです。
| 
 注意: 新規の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ファイル名および  | 
| 
 
  | 
 
  |