Used for caching compiled XSL Transformations (XSLT) templates.
The following C++ example demonstrates the use of a single style sheet with multiple XML files. The style sheet is loaded once and cached into the IXSLTemplate object.
#import "msxml5.dll"
using namespace MSXML2;
#define CHECK_AND_RELEASE(pInterface) \
if(pInterface) \
{\
pInterface->Release();\
pInterface = NULL;\
}\
#define RELEASE(pInterface) \
{\
pInterface->Release();\
pInterface = NULL;\
}\
BOOL XSLTemplateDemo()
{
BOOL bResult = FALSE;
short sResult = FALSE;
IXMLDOMDocument2 *pStyleSheet=NULL;
IXMLDOMDocument2 *pIXMLDOMDocument2 =NULL;
IXSLTemplate *pIXSLTemplate=NULL;
IXSLProcessor *pIXSLProcessor=NULL;
IXMLDOMDocument2 *pIXMLDOMDocument=NULL;
HRESULT hr;
VARIANT varValue;
try
{
hr = CoCreateInstance(CLSID_XSLTemplate50, NULL, CLSCTX_SERVER,
IID_IXSLTemplate, (LPVOID*)(&pIXSLTemplate));
SUCCEEDED(hr) ? 0 : throw hr;
if(pIXSLTemplate)
{
hr=CoCreateInstance(CLSID_FreeThreadedDOMDocument50, NULL,
CLSCTX_SERVER, IID_IXMLDOMDocument2,
(LPVOID*)(&pStyleSheet));
SUCCEEDED(hr) ? 0 : throw hr;
if(pStyleSheet)
{
hr=pStyleSheet->put_async(VARIANT_FALSE);
if(SUCCEEDED(hr))
{
hr=pStyleSheet->load(_variant_t(
_T("d:\\inetpub\\wwwroot\\samplexsl.xml")), &sResult);
if(SUCCEEDED(hr) && (sResult==VARIANT_TRUE))
{
hr=pIXSLTemplate->putref_stylesheet(pStyleSheet);
if(SUCCEEDED(hr))
{
hr=pIXSLTemplate->createProcessor(&pIXSLProcessor);
SUCCEEDED(hr) ? 0 : throw hr;
if(pIXSLProcessor)
{
hr=CoCreateInstance(CLSID_DOMDocument50, NULL,
CLSCTX_SERVER, IID_IXMLDOMDocument2,
(LPVOID*)(&pIXMLDOMDocument));
SUCCEEDED(hr) ? 0 : throw hr;
if(pIXMLDOMDocument)
{
hr=pIXMLDOMDocument->put_async(VARIANT_FALSE);
if(SUCCEEDED(hr))
{
hr=pIXMLDOMDocument->load(_variant_t(
_T("d:\\inetpub\\wwwroot\\samplexmldtd.xml")),
&sResult);
if(SUCCEEDED(hr) && (sResult==VARIANT_TRUE))
{
hr=pIXSLProcessor->put_input(_variant_t(
pIXMLDOMDocument));
if(SUCCEEDED(hr))
{
hr=pIXSLProcessor->transform(
&sResult);
if(SUCCEEDED(hr)&&(sResult==
VARIANT_TRUE))
{
pIXSLProcessor->get_output(
&varValue);
::MessageBox(NULL,
_bstr_t(varValue),
_T("Transformed
Output"), MB_OK);
}
}
}
}
RELEASE(pIXMLDOMDocument);
}
// Load another document.
hr=CoCreateInstance(CLSID_DOMDocument50, NULL,
CLSCTX_SERVER, IID_IXMLDOMDocument2,
(LPVOID*)(&pIXMLDOMDocument2));
SUCCEEDED(hr) ? 0 : throw hr;
if(pIXMLDOMDocument2)
{
hr=pIXMLDOMDocument2->put_async(VARIANT_FALSE);
if(SUCCEEDED(hr))
{
// Load some XML into the document.
hr=pIXMLDOMDocument2->loadXML(
_T("<COLLECTION\ xmlns:dt=\"urn:schemas-
microsoft-\ com:datatypes\">\
<DATE dt:dt=\"datetime\">1998-10-
13T15:56:00\
</DATE><BOOK><TITLE>Lover Birds</TITLE> \
<AUTHOR>Cynthia Randall</AUTHOR> \
<PUBLISHER>Lucerne Publishing</PUBLISHER> \
</BOOK> \
</COLLECTION>"), &sResult);
if(SUCCEEDED(hr) && (sResult==VARIANT_TRUE))
{
// Use the same processor.
hr=pIXSLProcessor->put_input(_variant_t(
pIXMLDOMDocument2));
if(SUCCEEDED(hr))
{
hr=pIXSLProcessor->transform(
&sResult);
if(SUCCEEDED(hr)&&(sResult==
VARIANT_TRUE))
{
pIXSLProcessor->get_output(
&varValue);
::MessageBox(NULL,
_bstr_t(varValue),
_T("Transformed
Output"), MB_OK);
}
}
}
}
RELEASE(pIXMLDOMDocument2);
}
RELEASE(pIXSLProcessor);
}
}
}
}
RELEASE(pStyleSheet);
}
RELEASE(pIXSLTemplate);
}
}
catch(...)
{
CHECK_AND_RELEASE(pIXSLProcessor);
CHECK_AND_RELEASE(pIXSLTemplate);
CHECK_AND_RELEASE(pStyleSheet);
CHECK_AND_RELEASE(pIXMLDOMDocument);
CHECK_AND_RELEASE(pIXMLDOMDocument2);
DisplayErrorToUser();
}
return bResult;
}
Before MSXML 2.6, every call to the transformNode or transformNodeToObject method had to recompile the style sheet because the style sheet was simply passed as an IXMLDOMNode. You can increase performance by caching the compiled style sheet and reusing it with the IXSLTemplate object.
To cache a compiled XSLT style sheet, load an XSLT style sheet into an IXSLTemplate object. This object is free-threaded and stateless, so it can be stored in shared Active Server Pages (ASP) application state. Then to transform a given document using this template, create an IXSLProcessor object using the createProcessor method. The IXSLProcessor object stores the state for one transform call and has a rental-threading model.
Note In MSXML, "free-threaded" means ThreadingModel='Both', and cross-thread marshalling is supported.
This object is an extension of the World Wide Web Consortium (W3C) Document Object Model (DOM).
MSXML 2.6 and later
Implementation: msxml5.dll, msxml2.lib
Header and IDL files: msxml2.h, msxml2.idl
Version-Dependent ProgID: Msxml2.XSLTemplate.5.0
Version-Dependent CLSID: 88D969C3-F192-11D4-A65F-0040963251E5
To view reference information for Visual Basic, C/C++, or Script only, click the Language Filter button
in the upper-left corner of the page.