Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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.
#include “msxml6.h”
#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_XSLTemplate60, NULL, CLSCTX_SERVER,
IID_IXSLTemplate, (LPVOID*)(&pIXSLTemplate));
SUCCEEDED(hr) ? 0 : throw hr;
if(pIXSLTemplate)
{
hr=CoCreateInstance(CLSID_FreeThreadedDOMDocument60, 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("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_DOMDocument60, 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("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_DOMDocument60, 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;
}
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).
Implementation:
msxml3.dll, msxml2.lib (MSXML 3.0)
msxml6.dll, msxml6.lib (MSXML 6.0)
Header and IDL files: msxml2.h, msxml2.idl, msmxl6.h, msxml6.idl
Implemented in: MSXML 3.0 and later