Package XSLTVM implements the XSL Transformation (XSLT) language as specified in W3C Recommendation 16 November 1999. The XSLTVM package contains two interfaces.
This chapter contains the following sections:
XSLT Virtual Machine is the software implementation of a "CPU" designed to run compiled XSLT code. A concept of virtual machine assumes a compiler compiling XSLT stylesheets to a sequence of byte codes or machine instructions for the "XSLT CPU". The byte-code program is a platform-independent sequence of 2-byte units. It can be stored, cached and run on different XSLTVM. The XSLTVM uses the bytecode programs to transform instance XML documents. This approach clearly separates compile (design)-time from run-time computations and specifies a uniform way of exchanging data between instructions.
A typical scenario of using the package APIs has the following steps:
Create/Use an XML meta context object.
xctx = XmlCreate(,...);
Create/Use an XSLT Compiler object.
comp = XmlXvmCreateComp(xctx);
Compile an XSLT stylesheets and cache the result bytecode.
code = XmlXvmCompileFile(comp, xslFile, baseuri, flags, );
Create/Use an XSLTVM object. The explicit stack size setting are needed when XSLTVM terminates with "... Stack Overflow" message or when smaller memory footprints are required (see XmlXvmCreate
).
vm = XmlXvmCreate(xctx, "StringStack", 32, "NodeStack", 24, NULL);
Set a stylesheet bytecode to the XSLTVM object.
len = XmlXvmGetBytecodeLength(code, ); err = XmlXvmSetBytecodeBuffer(vm, code, len);
Transform an instance XML document.
err = XmlXvmTransformFile(vm, xmlFile, baseuri);
Clean.
XmlXvmDestroy(vm);
XmlXvmDestroyComp(comp);
XmlDestroy(xctx);
Table 16-1 summarizes the methods available through the XSLTVM Interface.
Table 16-1 Summary of XSLTC Methods; XSLTVM Package
Function | Summary |
---|---|
Compile an XSLT stylesheet from buffer into bytecode. |
|
Compile an XSLT stylesheet from DOM into bytecode. |
|
Compile an XSLT stylesheet from file into bytecode. |
|
Compile XSLT stylesheet from URI into byte code. |
|
Compile an XPath expression. |
|
Create an XSLT compiler. |
|
Destroy an XSLT compiler object. |
|
Returns the bytecode length. |
Compile an XSLT stylesheet from buffer into bytecode. Compiler flags could be one or more of the following:
XMLXVM_DEBUG
forces compiler to include debug information into the bytecode
XMLXVM_STRIPSPACE
is equivalent to <xsl:strip-space elements="*"/>
.
The generated bytecode resides in a compiler buffer which is freed when next stylesheet is compiled or when compiler object is deleted. Hence, if the bytecode is to be reused it should be copied into another location.
ub2 *XmlXvmCompileBuffer( xmlxvmcomp *comp, oratext *buffer, ub4 length, oratext *baseURI, xmlxvmflag flags, xmlerr *error);
Parameter | In/Out | Description |
---|---|---|
comp |
IN |
compiler object |
buffer |
IN |
pointer to buffer containing stylesheet document |
length |
IN |
length of the stylesheet document in bytes |
baseuri |
IN |
base URI of the document |
flags |
IN |
flags for the current compilation |
error |
OUT |
returned error code |
(ub2 *)
bytecode or NULL
on error
Compile an XSLT stylesheet from DOM into bytecode. Compiler flags could be one or more of the following:
XMLXVM_DEBUG
forces compiler to include debug information into the bytecode
XMLXVM_STRIPSPACE
is equivalent to <xsl:strip-space elements="*"/>
.
The generated bytecode resides in a compiler buffer which is freed when next stylesheet is compiled or when compiler object is deleted. Hence, if the bytecode is to be reused it should be copied into another location.
ub2 *XmlXvmCompileDom( xmlxvmcomp *comp, xmldocnode *root, xmlxvmflag flags, xmlerr *error);
Parameter | In/Out | Description |
---|---|---|
comp |
IN |
compiler object |
rooot |
IN |
root element of the stylesheet DOM |
flags |
IN |
flags for the current compilation |
error |
OUT |
returned error code |
(ub2 *)
bytecode or NULL
on error
Compile XSLT stylesheet from file into bytecode. Compiler flags could be one or more of the following:
XMLXVM_DEBUG
forces compiler to include debug information into the bytecode
XMLXVM_STRIPSPACE
is equivalent to <xsl:strip-space elements="*"/>
.
The generated bytecode resides in a compiler buffer which is freed when next stylesheet is compiled or when compiler object is deleted. Hence, if the bytecode is to be reused it should be copied into another location.
ub2 *XmlXvmCompileFile( xmlxvmcomp *comp, oratext *path, oratext *baseURI, xmlxvmflag flags, xmlerr *error);
Parameter | In/Out | Description |
---|---|---|
comp |
IN |
compiler object |
path |
IN |
path of XSL stylesheet file |
baseuri |
IN |
base URI of the document |
flags |
IN |
flags for the current compilation |
error |
OUT |
returned error code |
(ub2 *)
bytecode or NULL
on error
Compile XSLT stylesheet from URI into bytecode. Compiler flags could be one or more of the following:
XMLXVM_DEBUG
forces compiler to include debug information into the bytecode
XMLXVM_STRIPSPACE
is equivalent to <xsl:strip-space elements="*"/>
.
The generated bytecode resides in a compiler buffer which is freed when next stylesheet is compiled or when compiler object is deleted. Hence, if the bytecode is to be reused it should be copied into another location.
ub2 *XmlXvmCompileURI( xmlxvmcomp *comp, oratext *uri, xmlxvmflag flags, xmlerr *error);
Parameter | In/Out | Description |
---|---|---|
comp |
IN |
compiler object |
uri |
IN |
URI of the file that contains the XSL stylesheet |
flags |
IN |
flags for the current compilation |
error |
OUT |
returned error code |
(ub2 *)
bytecode or NULL
on error
Compiles an XPath expression. The optional pfxmap
is used to map namespace prefixes to URIs in the XPath expression. It is an array of prefix, URI values, ending in NULL
, and so on.
ub2 *XmlXvmCompileXPath( xmlxvmcomp *comp, oratext *xpath, oratext **pfxmap, xmlerr *error);
Parameter | In/Out | Description |
---|---|---|
comp |
IN |
compiler object |
xpath |
IN |
XPath expression |
pfxmap |
IN |
array of prefix-URI mappings |
error |
OUT |
returned error code |
(ub2 *)
XPath expression bytecode or NULL
on error
Create an XSLT compiler object. The XSLT compiler is used to compile XSLT stylesheets into bytecode.
xmlxvmcomp *XmlXvmCreateComp( xmlctx *xctx);
Parameter | In/Out | Description |
---|---|---|
xctx |
IN |
XML context |
(xmlxvmcomp *)
XSLT compiler object, or NULL
on error
See Also:
XmlXvmDestroyComp()Destroys an XSLT compiler object
void XmlXvmDestroyComp( xmlxvmcomp *comp);
Parameter | In/Out | Description |
---|---|---|
comp |
IN |
XSLT compiler object |
See Also:
XmlXvmCreateComp()The bytecode length is needed when the bytecode is to be copied or when it is set into XSLTVM.
ub4 XmlXvmGetBytecodeLength( ub2 *bytecode, xmlerr *error);
Parameter | In/Out | Description |
---|---|---|
bytecode |
IN |
bytecode buffer |
error |
OUT |
returned error code |
(ub4)
The bytecode length in bytes.
Table 16-2 summarizes the methods available through the XSLTVM Interface.
Table 16-2 Summary of XSLTVM Methods; Package XSLTVM
Function | Summary |
---|---|
XMLXSLTVM debug function. |
|
Create an XSLT virtual machine. |
|
Destroys an XSLT virtual machine. |
|
Evaluate already-compiled XPath expression. |
|
Get boolean value of XPath object. |
|
Get node from nodeset type XPathobject. |
|
Get number of nodes in nodeset type XPathobject. |
|
Get number from XPath object. |
|
Get string from XPath object. |
|
Get XPath object type. |
|
Returns the output DOM. |
|
Resets the stylesheet top level text parameters. |
|
Sets the base URI for the XLTVM. |
|
Set the compiled bytecode. |
|
Set the compiled byte code from file. |
|
Set the compiled bytecode. |
|
Set a callback function for debugging. |
|
Sets the XSLTVM to output document node. |
|
Sets the encoding for the XSLTVM output. |
|
Sets XSLTVM to output SAX. |
|
Set the XSLTVM output to a user-defined stream. |
|
Set the stylesheet top-level text parameter. |
|
Run compiled XSLT stylesheet on XML document in memory. |
|
Run compiled XSLT stylesheet on XML document as DOM. |
|
Run compiled XSLT stylesheet on XML document in file. |
|
Run compiled XSLT stylesheet on XML document from URI. |
Debug callback function for XSLT VM.
#define XMLXVM_DEBUG_F(func, line, file, obj, n) void func( ub2 line, oratext *file, xvmobj *obj, ub4 n)
Parameter | In/Out | Description |
---|---|---|
line |
IN |
source stylesheet line number |
file |
IN |
stylesheet filename |
obj |
IN |
current VM object |
n |
IN |
index of current node |
See Also:
XmlXvmSetDebugFunc()Create an XSLT virtual machine. Zero or more of the following XSLTVM properties could be set by using this API:
"VMStack", size
sets the size[Kbyte] of the main VM stack; default size is 4K.
"NodeStack", size
sets the size[Kbyte] of the node-stack; default size is 16K.
"StringStack", size
sets the size[Kbyte] of the string-stack; default size is 64K.
If the stack size is not specified the default size is used. The explicit stack size setting is needed when XSLTVM terminates with "Stack Overflow" message or when smaller memory footprints are required.
xmlxvm *XmlXvmCreate(
xmlctx *xctx,
list);
Parameter | In/Out | Description |
---|---|---|
xctx |
IN |
XML context |
list
|
IN |
NULL -terminated list of properties to set; can be empty |
(xmlxvm *)
XSLT virtual machine object, or NULL
on error
See Also:
XmlXvmDestroy()Destroys an XSLT virtual machine
void XmlXvmDestroy( xmlxvm *vm);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
See Also:
XmlXvmCreate()Evaluate already-compiled XPath expression
xvmobj *XmlXvmEvaluateXPath( xmlxvm *vm, ub2 *bytecode, ub4 ctxpos, ub4 ctxsize, xmlnode *ctxnode);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
XSLTVM object |
bytecode |
IN |
XPath expression bytecode |
ctxpos |
IN |
current context position |
ctxsize |
IN |
current context size |
ctxnode |
IN |
current context node |
(xvmobj *)
XPath object
Get boolean value of XPath object
boolean XmlXvmGetObjectBoolean( xvmobj *obj);
Parameter | In/Out | Description |
---|---|---|
obj |
IN |
object |
(boolean)
value of an XPath object
See Also:
XmlXvmGetObjectType(), XmlXvmGetObjectNSetNum(), XmlXvmGetObjectNSetNode(), XmlXvmGetObjectNumber(), XmlXvmGetObjectBoolean()Get node from nodeset-type XPath object
xmlnode *XmlXvmGetObjectNSetNode( xvmobj *obj, ub4 i);
Parameter | In/Out | Description |
---|---|---|
obj |
IN |
object |
i |
IN |
node index in nodeset |
(xmlnode *)
The object type or values.
See Also:
XmlXvmGetObjectType(), XmlXvmGetObjectNSetNum(), XmlXvmGetObjectString(), XmlXvmGetObjectNumber(), XmlXvmGetObjectBoolean()Get number of nodes in nodeset-type XPath object
ub4 XmlXvmGetObjectNSetNum( xvmobj *obj);
Parameter | In/Out | Description |
---|---|---|
obj |
IN |
object |
(ub4)
number of nodes in nodeset
See Also:
XmlXvmGetObjectType(), XmlXvmGetObjectNSetNode(), XmlXvmGetObjectString(), XmlXvmGetObjectNumber(), XmlXvmGetObjectBoolean()Get number from XPath object.
double XmlXvmGetObjectNumber( xvmobj *obj);
Parameter | In/Out | Description |
---|---|---|
obj |
IN |
object |
(double)
number
See Also:
XmlXvmGetObjectType(), XmlXvmGetObjectNSetNum(), XmlXvmGetObjectNSetNode(), XmlXvmGetObjectString(), XmlXvmGetObjectBoolean()Get string from XPath object.
oratext *XmlXvmGetObjectString( xvmobj *obj);
Parameter | In/Out | Description |
---|---|---|
obj |
IN |
object |
(oratext *)
string
See Also:
XmlXvmGetObjectType(), XmlXvmGetObjectNSetNum(), XmlXvmGetObjectNSetNode(), XmlXvmGetObjectNumber(), XmlXvmGetObjectBoolean()Get XPath object type
xmlxvmobjtype XmlXvmGetObjectType( xvmobj *obj);
Parameter | In/Out | Description |
---|---|---|
obj |
IN |
object |
(xmlxvmobjtype)
type-code for object
See Also:
XmlXvmGetObjectNSetNum(), XmlXvmGetObjectNSetNode(), XmlXvmGetObjectString(), XmlXvmGetObjectNumber(), XmlXvmGetObjectBoolean()Returns the root node of the result DOM tree (if any). XmlXvmSetOutputDom
has to be used before transformation to set the VM to output a DOM tree (the default VM output is a stream).
xmlfragnode *XmlXvmGetOutputDom( xmlxvm *vm);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
(xmlfragnode *)
output DOM, or NULL
in a case of SAX or Stream output.
See Also:
XmlXvmSetOutputDom()Resets the stylesheet top-level parameters with their default values.
void XmlXvmResetParams( xmlxvm *vm);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
Sets the base URI for the XSLTVM. The baseuri is used by VM to the compose the path XML documents to be loaded for transformation using document
or XmlXvmTransformFile
.
xmlerr XmlXvmSetBaseURI( xmlxvm *vm, oratext *baseuri);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
baseuri |
IN |
VM base URI for reading and writing documents |
(xmlerr)
error code.
Set the compiled bytecode from buffer. Any previously set bytecode is replaced. An XML transformation can't be performed if the stylesheet bytecode is not set. The VM doesn't copy the bytecode into internal buffer, hence the it shouldn't be freed before VM finishes using it.
xmlerr XmlXvmSetBytecodeBuffer( xmlxvm *vm, ub2 *buffer, size_t buflen);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
XSLT VM context |
buffer |
IN |
user's buffer |
buflen |
IN |
size of buffer, in bytes |
(xmlerr)
numeric error code, XMLERR_OK [0]
on success
Set the compiled bytecode from file. Any previously set bytecode is replaced. An XML transformation can't be performed if the stylesheet bytecode is not set.
xmlerr XmlXvmSetBytecodeFile( xmlxvm *vm, oratext *path);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
XSLT VM context |
path |
IN |
path of bytecode file |
(xmlerr)
numeric error code, XMLERR_OK [0]
on success
Set the compiled bytecode from URI. Any previously set bytecode is replaced. An XML transformation can't be performed if the stylesheet bytecode is not set.
xmlerr XmlXvmSetBytecodeURI( xmlxvm *vm, oratext *uri);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
XSLT VM context |
uri |
IN |
path of bytecode file |
(xmlerr)
numeric error code, XMLERR_OK [0]
on success
The user callback function is invoked by VM every time the execution reaches a new line in the XSLT stylesheet. The VM passes to the user the stylesheet file name, the line number, the current context nodes-set and the current node index in the node-set. IMPORTANT - the stylesheet has to be compiled with flag XMLXVM_DEBUG
.
#define XMLXVM_DEBUG_FUNC(func) void func (ub2 line, oratext *filename, xvmobj *obj, ub4 n) xmlerr XmlXvmSetDebugFunc( xmlxvm *vm, XMLXVM_DEBUG_FUNC(debugcallback));
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
XSLT VM context |
func |
IN |
callback function |
(xmlerr)
numeric error code, XMLERR_OK [0]
on success
Sets the XSLTVM to output DOM. If xmldocnode==NULL
, then the result DOM tree belongs to the VM object and is deleted when a new transformation is performed or when the VM object is deleted. If the result DOM tree is to be used for longer period of time then an xmldocnode
has to be created and set to the VM object.
xmlerr XmlXvmSetOutputDom( xmlxvm *vm, xmldocnode *doc);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
doc |
IN |
empty document |
(xmlerr)
error code
Sets the encoding for the XSLTVM stream output. If the input (data) encoding is different from the one set by this APIs then encoding conversion is performed. This APIs overrides the encoding set in the XSLT stylesheet (if any).
xmlerr XmlXvmSetOutputEncoding( xmlxvm *vm, oratext *encoding);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
encoding |
IN |
output encoding |
(xmlerr)
error code.
Set XSLTVM to output SAX. If the SAX callback interface object is provided the VM outputs the result document in a form of SAX events using the user specified callback functions.
xmlerr XmlXvmSetOutputSax( xmlxvm *vm, xmlsaxcb *saxcb, void *saxctx);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
saxcb |
IN |
SAX callback object |
saxctx |
IN |
SAX context |
(xmlerr)
error code
Set the XSLTVM output to a user-defined stream. The default XSLTVM output is a stream. This APIs overrides the default stream with user specified APIs for writing.
xmlerr XmlXvmSetOutputStream( xmlxvm *vm, xmlostream *ostream);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
ostream |
IN |
stream object |
(xmlerr)
error code.
Set the stylesheet top-level text parameter. The parameter value set in the XSLT stylesheet is overwritten. Since the top-level parameters are reset with stylesheet values after each transformation, this APIs has to be called again.
xmlerr XmlXvmSetTextParam( xmlxvm *vm, oratext *name, oratext *value);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
name |
IN |
name of top-level parameter |
value |
IN |
value of top-level parameter |
(xmlerr)
error code, XMLERR_SUCC [0]
on success.
Run compiled XSLT stylesheet on XML document in memory. The compiled XSLT stylesheet (bytecode) should be set using XmlXvmSetBytecodeXXX
prior to this call.
xmlerr XmlXvmTransformBuffer( xmlxvm *vm, oratext *buffer, ub4 length, oratext *baseURI);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
buffer |
IN |
NULL -terminated buffer that contains the XML document |
length |
IN |
length of the XML document |
baseURI |
IN |
base URI of XML document |
(xmlerr)
error code.
Run compiled XSLT stylesheet on XML document as DOM. The compiled XSLT stylesheet (bytecode) should be set using XmlXvmSetBytecodeXXX
prior to this call.
xmlerr XmlXvmTransformDom( xmlxvm *vm, xmldocnode *root);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
root |
IN |
root element of XML document's DOM |
(xmlerr)
error code.
Run compiled XSLT stylesheet on XML document in file. The compiled XSLT stylesheet (bytecode) should be set using XmlXvmSetBytecodeXXX
prior to this call.
xmlerr XmlXvmTransformFile( xmlxvm *vm, oratext *path, oratext *baseURI);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
path |
IN |
path of XML document to transform |
baseURI |
IN |
base URI of XML document |
(xmlerr)
error code
Run compiled XSLT stylesheet on XML document from URI. The compiled XSLT stylesheet (bytecode) should be set using XmlXvmSetBytecodeXXX
prior to this call.
xmlerr XmlXvmTransformURI( xmlxvm *vm, oratext *uri);
Parameter | In/Out | Description |
---|---|---|
vm |
IN |
VM object |
uri |
IN |
URI of XML document to transform |
(xmlerr)
error code.