Calling the transformNode
or transformNodeToObject
method does not always allow for maximum performance, because the style sheet object passed into the method is a DOM node, and must be recompiled every time the method is called. Compiling the style sheet means setting up all its template rules in an executable state. If you need to call these methods repeatedly, you should cache the compiled XSLT style sheet in an XSLTemplate
object, and use this object to perform your transformation. This helps reduce overhead, and increases the performance of your XSLT application.
This section demonstrates the use of the XSLTemplate
object with a sample Web application for reading book reviews. For simplicity, we'll assume that a small bookstore puts all its book reviews in a single XML file, BookReview.xml. To read the review of particular book, a reader submits a book title from our ReviewReader application. This triggers a transformation that is, the application applies an XSLT style sheet to the XML file, with the new book title as its input. The review of the book is the output HTML.
This example uses the following three source files: BookReview.xml, BookReview.xsl, and BookReview.htm. These files are listed below.
BookReview.xml
<?xml version='1.0'?> <book-review> <book> <title>A Good Book</title> <author>The Good Writer</author> <publisher>The Publisher</publisher> <date>A Good Day</date> <Review> <title>A Good Book</title> by <author>The Good Writer</author>, published by <publisher>The Publisher</publisher> on <date>A Good Day</date>, is indeed a good book. </Review> </book> <book> <title>A Bad Book</title> <author>The Bad Writer</author> <publisher>The Publisher</publisher> <date>A Bad Day</date> <Review> <title>A Bad Book</title> by <author>The Bad Writer</author>, published by <publisher>The Publisher</publisher> on <date>A Bad Day</date>, is indeed a bad book. </Review> </book> <book> <title>A So-so Book</title> <author>The So-so Writer</author> <publisher>The Publisher</publisher> <date>A So-so Day</date> <Review> <title>A So-so Book</title> by <author>The So-so Writer</author>, published by <publisher>The Publisher</publisher> on <date>A So-so Day</date>, is indeed a so-so book. </Review> </book> </book-review>
BookReview.xsl
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:param name="title" /> <xsl:template match="/"> <HTML> <HEAD> </HEAD> <BODY> <xsl:apply-templates select="//book[title=$title]" /> </BODY> </HTML> </xsl:template> <xsl:template match="book"> <TABLE> <TR> <TD style="font-weight:bold">Title:</TD> <TD><xsl:apply-templates select="title"/></TD> </TR> <TR> <TD style="font-weight:bold">Author:</TD> <TD><xsl:apply-templates select="author"/></TD> </TR> <TR> <TD style="font-weight:bold">Date:</TD> <TD><xsl:apply-templates select="date"/></TD> </TR> <TR> <TD style="font-weight:bold">Publisher:</TD> <TD><xsl:apply-templates select="publisher"/></TD> </TR> <TR> <TD style="font-weight:bold">Review:</TD> <TD><xsl:apply-templates select="Review"/></TD> </TR> </table> </xsl:template> <xsl:template match="title"> <SPAN><xsl:value-of select="."/></SPAN> </xsl:template> <xsl:template match="author"> <SPAN><xsl:value-of select="."/></SPAN> </xsl:template> <xsl:template match="publisher"> <SPAN><xsl:value-of select="."/></SPAN> </xsl:template> <xsl:template match="date"> <SPAN><xsl:value-of select="."/></SPAN> </xsl:template> <xsl:template match="review"> <P><xsl:apply-templates /></P> </xsl:template> </xsl:stylesheet>
BookReview.htm
<HTML> <HEAD> <SCRIPT language="jscript"> var objSrcTree, ObjXSLT, objCache; function init() { objSrcTree = new ActiveXObject('MSXML2.DOMDocument.5.0'); objSrcTree.async = false; objSrcTree.load('sample.xml'); objXSLT=new ActiveXObject('MSXML2.FreeThreadedDOMDocument.5.0'); objXSLT.async = false; objXSLT.load('sample.xsl'); objCache = new ActiveXObject("Msxml2.XSLTemplate.5.0"); objCache.stylesheet = objXSLT; output.innerHTML = "Select a book above to read the review!"; } function show(title) { var objXSLTProc = objCache.createProcessor(); objXSLTProc.input = objSrcTree; objXSLTProc.addParameter("title", title, ""); objXSLTProc.transform(); output.innerHTML = objXSLTProc.output; } </SCRIPT> </HEAD> <BODY onload="init();"> <DIV>Books reviewed: <A HREF="javascript:show('A Good Book')">A Good Book</A> <A HREF="javascript:show('A Bad Book')">A Bad Book</A> <A HREF="javascript:show('A So-so Book')">A So-so Book</A> </DIV> <DIV id="output" style="margin:1em"></DIV> </BODY> </HTML>
To perform your transformations with XSLTemplate
As shown above, to use the XSLTemplate
object to cache a compiled XSLT style sheet and perform transformations, your must perform the following tasks.
FreeThreadedDOMDocument
object. Be sure to set the async
property of this object to "false"
.XSLTemplate
object. Set its stylesheet
property to the XSLT style sheet created in the Step 1. Notice that loading and caching are carried out in the init()
function when the HTML page is first loaded.DOMDocument
object. In this example, this XML document is loaded once in the init()
function as well. In other applications, this is not necessarily the case.XSLProcessor
object for each transformation. The following steps are needed to complete the transformation.input
property of the XSLProcessor
object created in Step 3.addParameter
method on the XSLProcessor
object to pass any required global variables used in the XSLT style sheet. In the example above, the style sheet uses a title
parameter to select a book with the specified title: <xsl:apply-templates select="//book[title=$title]" />
.recordset
object in ADO or a Response
object in ASP) to the output
parameter of the XSLProcessor
object. Choose this option if you do not want to use the default output stream object.transform
method on the XSLProcessor
object to start the transformation.output
parameter of the XSLProcessor
object.In addition to passing a parameter to an XSLT style sheet, as described in Step 6, you can also pass an object (a DOM node), if necessary. For more information about how to pass an object to an XSLT style sheet by way of an XSLProcessor
object, see the XSLProcessor.addObject method.