LOCAL loXslt, loParser, loXslDoc, loXslProc *** create the XSLTemplate object to cache the compiled XSLT style sheet *** and use this object to perform the transformation to reduce overhead. loXslt = CREATEOBJECT( 'Msxml2.XSLTemplate.4.0' ) loParser = CREATEOBJECT( 'Msxml2.DOMDocument.4.0' ) loXslDoc = CREATEOBJECT( 'Msxml2.FreeThreadedDOMDocument.4.0' ) loXslDoc.Async = .F. *** load the style sheet loXslDoc.Load( "Orders.xsl" ) loXslt.Stylesheet = loXslDoc loParser.async = .f. *** load the Xml file loParser.Load( "Orders.xml" ) *** Create an instance of the XSLT processor loXslProc = loXslt.CreateProcessor() loXslProc.Input = loParser *** apply the transformation loXslProc.Transform() *** save the HTML STRTOFILE( loXslProc.Output, 'Orders.html' )XML looks like this:
<?xml version="1.0" encoding="WINDOWS-1252"?><ORDERS><CUSTOMER ID="BOTTM"><COMPANY>Bottom-Dollar Markets</COMPANY><CONTACT>Elizabeth Lincoln</CONTACT><ORDERHEADER ID="10080"><DATE>1993-11-16</DATE><AMOUNT>2393.4000</AMOUNT><ORDERLINE LINE="1" ID="2"><PRICE>13.3000</PRICE><QUANTITY>30</QUANTITY><PRODUCT>Chang</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="12"><PRICE>26</PRICE><QUANTITY>60</QUANTITY><PRODUCT>Queso Manchego La Pastora</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="30"><PRICE>18.1000</PRICE><QUANTITY>24</QUANTITY><PRODUCT>Nord-Ost Matjeshering</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10176"><DATE>1994-04-22</DATE><AMOUNT>727.5000</AMOUNT><ORDERLINE LINE="1" ID="55"><PRICE>16.8000</PRICE><QUANTITY>5</QUANTITY><PRODUCT>Pâté chinois</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="67"><PRICE>9</PRICE><QUANTITY>50</QUANTITY><PRODUCT>Laughing Lumberjack Lager</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="68"><PRICE>8.7000</PRICE><QUANTITY>5</QUANTITY><PRODUCT>Scottish Longbreads</PRODUCT></ORDERLINE><ORDERLINE LINE="4" ID="71"><PRICE>15</PRICE><QUANTITY>10</QUANTITY><PRODUCT>Flotemysost</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10183"><DATE>1994-04-30</DATE><AMOUNT>237.3000</AMOUNT><ORDERLINE LINE="1" ID="10"><PRICE>21.7000</PRICE><QUANTITY>3</QUANTITY><PRODUCT>Ikura</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="23"><PRICE>6.3000</PRICE><QUANTITY>14</QUANTITY><PRODUCT>Tunnbröd</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="49"><PRICE>14</PRICE><QUANTITY>6</QUANTITY><PRODUCT>Maxilaku</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10230"><DATE>1994-06-30</DATE><AMOUNT>2120</AMOUNT><ORDERLINE LINE="1" ID="27"><PRICE>30</PRICE><QUANTITY>36</QUANTITY><PRODUCT>Schoggi Schokolade</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="56"><PRICE>26</PRICE><QUANTITY>40</QUANTITY><PRODUCT>Gnocchi di nonna Alice</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10231"><DATE>1994-06-30</DATE><AMOUNT>414</AMOUNT><ORDERLINE LINE="1" ID="62"><PRICE>34.5000</PRICE><QUANTITY>12</QUANTITY><PRODUCT>Tarte au sucre</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10240"><DATE>1994-07-13</DATE><AMOUNT>2020</AMOUNT><ORDERLINE LINE="1" ID="32"><PRICE>22</PRICE><QUANTITY>49</QUANTITY><PRODUCT>Mascarpone Fabioli</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="33"><PRICE>1</PRICE><QUANTITY>18</QUANTITY><PRODUCT>Geitost</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="46"><PRICE>8.4000</PRICE><QUANTITY>10</QUANTITY><PRODUCT>Spegesild</PRODUCT></ORDERLINE><ORDERLINE LINE="4" ID="55"><PRICE>16.8000</PRICE><QUANTITY>50</QUANTITY><PRODUCT>Pâté chinois</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10389"><DATE>1995-01-07</DATE><AMOUNT>1832.8000</AMOUNT><ORDERLINE LINE="1" ID="10"><PRICE>24.8000</PRICE><QUANTITY>16</QUANTITY><PRODUCT>Ikura</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="55"><PRICE>19.2000</PRICE><QUANTITY>15</QUANTITY><PRODUCT>Pâté chinois</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="62"><PRICE>39.4000</PRICE><QUANTITY>20</QUANTITY><PRODUCT>Tarte au sucre</PRODUCT></ORDERLINE><ORDERLINE LINE="4" ID="70"><PRICE>12</PRICE><QUANTITY>30</QUANTITY><PRODUCT>Outback Lager</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10410"><DATE>1995-01-28</DATE><AMOUNT>802</AMOUNT><ORDERLINE LINE="1" ID="33"><PRICE>2</PRICE><QUANTITY>49</QUANTITY><PRODUCT>Geitost</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="59"><PRICE>44</PRICE><QUANTITY>16</QUANTITY><PRODUCT>Raclette Courdavault</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10411"><DATE>1995-01-28</DATE><AMOUNT>1208.5000</AMOUNT><ORDERLINE LINE="1" ID="41"><PRICE>7.7000</PRICE><QUANTITY>25</QUANTITY><PRODUCT>Jack&apos;s New England Clam Chowder</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="44"><PRICE>15.5000</PRICE><QUANTITY>40</QUANTITY><PRODUCT>Gula Malacca</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="59"><PRICE>44</PRICE><QUANTITY>9</QUANTITY><PRODUCT>Raclette Courdavault</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10431"><DATE>1995-02-17</DATE><AMOUNT>2523</AMOUNT><ORDERLINE LINE="1" ID="17"><PRICE>31.2000</PRICE><QUANTITY>50</QUANTITY><PRODUCT>Alice Mutton</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="40"><PRICE>14.7000</PRICE><QUANTITY>50</QUANTITY><PRODUCT>Boston Crab Meat</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="47"><PRICE>7.6000</PRICE><QUANTITY>30</QUANTITY><PRODUCT>Zaanse koeken</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10492"><DATE>1995-04-19</DATE><AMOUNT>896</AMOUNT><ORDERLINE LINE="1" ID="25"><PRICE>11.2000</PRICE><QUANTITY>60</QUANTITY><PRODUCT>NuNuCa Nuß-Nougat-Creme</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="42"><PRICE>11.2000</PRICE><QUANTITY>20</QUANTITY><PRODUCT>Singaporean Hokkien Fried Mee</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10742"><DATE>1995-12-02</DATE><AMOUNT>3118</AMOUNT><ORDERLINE LINE="1" ID="3"><PRICE>10</PRICE><QUANTITY>20</QUANTITY><PRODUCT>Aniseed Syrup</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="60"><PRICE>34</PRICE><QUANTITY>50</QUANTITY><PRODUCT>Camembert Pierrot</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="72"><PRICE>34.8000</PRICE><QUANTITY>35</QUANTITY><PRODUCT>Mozzarella di Giovanni</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10918"><DATE>1996-03-19</DATE><AMOUNT>1930</AMOUNT><ORDERLINE LINE="1" ID="1"><PRICE>18</PRICE><QUANTITY>60</QUANTITY><PRODUCT>Chai</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="60"><PRICE>34</PRICE><QUANTITY>25</QUANTITY><PRODUCT>Camembert Pierrot</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10944"><DATE>1996-03-29</DATE><AMOUNT>1139.1000</AMOUNT><ORDERLINE LINE="1" ID="11"><PRICE>21</PRICE><QUANTITY>5</QUANTITY><PRODUCT>Queso Cabrales</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="44"><PRICE>19.4500</PRICE><QUANTITY>18</QUANTITY><PRODUCT>Gula Malacca</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="56"><PRICE>38</PRICE><QUANTITY>18</QUANTITY><PRODUCT>Gnocchi di nonna Alice</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10949"><DATE>1996-03-30</DATE><AMOUNT>4422</AMOUNT><ORDERLINE LINE="1" ID="6"><PRICE>25</PRICE><QUANTITY>12</QUANTITY><PRODUCT>Grandma&apos;s Boysenberry Spread</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="10"><PRICE>31</PRICE><QUANTITY>30</QUANTITY><PRODUCT>Ikura</PRODUCT></ORDERLINE><ORDERLINE LINE="3" ID="17"><PRICE>39</PRICE><QUANTITY>6</QUANTITY><PRODUCT>Alice Mutton</PRODUCT></ORDERLINE><ORDERLINE LINE="4" ID="62"><PRICE>49.3000</PRICE><QUANTITY>60</QUANTITY><PRODUCT>Tarte au sucre</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10975"><DATE>1996-04-11</DATE><AMOUNT>717.5000</AMOUNT><ORDERLINE LINE="1" ID="8"><PRICE>40</PRICE><QUANTITY>16</QUANTITY><PRODUCT>Northwoods Cranberry Sauce</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="75"><PRICE>7.7500</PRICE><QUANTITY>10</QUANTITY><PRODUCT>Rhönbräu Klosterbier</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="10982"><DATE>1996-04-13</DATE><AMOUNT>1014</AMOUNT><ORDERLINE LINE="1" ID="7"><PRICE>30</PRICE><QUANTITY>20</QUANTITY><PRODUCT>Uncle Bob&apos;s Organic Dried Pears</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="43"><PRICE>46</PRICE><QUANTITY>9</QUANTITY><PRODUCT>Ipoh Coffee</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="11027"><DATE>1996-05-03</DATE><AMOUNT>1170.3000</AMOUNT><ORDERLINE LINE="1" ID="24"><PRICE>4.5000</PRICE><QUANTITY>30</QUANTITY><PRODUCT>Guaraná Fantástica</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="62"><PRICE>49.3000</PRICE><QUANTITY>21</QUANTITY><PRODUCT>Tarte au sucre</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="11045"><DATE>1996-05-10</DATE><AMOUNT>1309.5000</AMOUNT><ORDERLINE LINE="1" ID="33"><PRICE>2.5000</PRICE><QUANTITY>15</QUANTITY><PRODUCT>Geitost</PRODUCT></ORDERLINE><ORDERLINE LINE="2" ID="51"><PRICE>53</PRICE><QUANTITY>24</QUANTITY><PRODUCT>Manjimup Dried Apples</PRODUCT></ORDERLINE></ORDERHEADER><ORDERHEADER ID="11048"><DATE>1996-05-11</DATE><AMOUNT>525</AMOUNT><ORDERLINE LINE="1" ID="68"><PRICE>12.5000</PRICE><QUANTITY>42</QUANTITY><PRODUCT>Scottish Longbreads</PRODUCT></ORDERLINE></ORDERHEADER></CUSTOMER></ORDERS>XSL looks like this:
<?xml version='1.0' encoding="WINDOWS-1252"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="CUSTOMER"> <html> <head> <title>Using XSLT to transform the Orders XML document into formatted HTML</title> </head> <body> <h1>Orders for <xsl:value-of select="COMPANY"/></h1> <xsl:for-each select="ORDERHEADER"> <h3>Order Number: <xsl:value-of select="@ID"/> Date: <xsl:value-of select="DATE"/> Total: <xsl:value-of select="AMOUNT"/></h3> <ul> <xsl:for-each select="ORDERLINE"> <li><xsl:value-of select="concat(QUANTITY, ' ')"/><xsl:value-of select="PRODUCT"/></li> </xsl:for-each> </ul> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>