Subject: RE: [xsl] Passing sort parameter as a hard-coded string From: Maria Amuchastegui <mamuchastegui@xxxxxxxxxxx> Date: Wed, 6 Apr 2005 11:53:52 -0400 |
I was able to solve this on my own. Thanks to everyone on this list for their contribution. ----- <html xmlns="http://www.w3.org/1999/xhtml <http://www.w3.org/1999/xhtml> " xml:lang="en"> <head> <script language="JavaScript"> //<![CDATA[ var arrSort = new Array(); arrSort["id"] = "ascending"; arrSort["date"] = "ascending"; arrSort["location"] = "ascending"; arrSort["number"] = "ascending"; arrSort["charges"] = "ascending"; arrSort["savings"] = "ascending"; arrSort["amount"] = "ascending"; function sortXML(theLink) { var column = "id"; var order = "ascending"; if(theLink) { column = theLink.innerHTML.toLowerCase(); if (arrSort[column] == 'ascending') { order = 'descending'; } else { order = 'ascending'; } arrSort[column] = order; } if (document.implementation && document.implementation.createDocument) // Netscape { var xslDoc; var xsltProcessor = new XSLTProcessor(); var myDOM; var xmlDoc; var xslDoc = document.implementation.createDocument("", "", null); var myXSLNode = document.getElementById("myXSLStylesheet"); var clonedXSLNode = xslDoc.importNode(myXSLNode.childNodes.item(1), true); xslDoc.appendChild(clonedXSLNode); xsltProcessor.importStylesheet(xslDoc); var xmlDoc = document.implementation.createDocument("", "", null); var myNode = document.getElementById("myXMLData"); var clonedNode = xmlDoc.importNode(myNode.childNodes.item(1), true); xmlDoc.appendChild(clonedNode); xsltProcessor.setParameter(null, "sortKey", column); xsltProcessor.setParameter(null, "sortOrder", order); var fragment = xsltProcessor.transformToFragment(xmlDoc,document); var containerElement = document.getElementById("ChargeableMessages"); while (containerElement.hasChildNodes()) { containerElement.removeChild(containerElement.lastChild); } myDOM = fragment; document.getElementById("ChargeableMessages").appendChild(fragment); } else if (window.ActiveXObject) // Internet Explorer { var xslDoc=new ActiveXObject("MSXML2.FreeThreadedDOMDocument"); var rsltDoc=new ActiveXObject("MSXML2.FreeThreadedDOMDocument"); var xslTemplate=new ActiveXObject("MSXML2.XSLTemplate"); xslDoc.load(myXSLStylesheet.XMLDocument); xslTemplate.stylesheet=xslDoc; var xslProc=xslTemplate.createProcessor(); xslProc.input=myXMLData.XMLDocument; xslProc.addParameter("sortKey", column); xslProc.addParameter("sortOrder", order); xslProc.transform(); ChargeableMessages.innerHTML = xslProc.output; return false; } else { alert('Your browser does not support client-side XSL transformations.'); // unsupported browser } return false; } var Columns = new Array('id', 'date', 'location', 'number', 'duration', 'charges'); function showArrow(column) { for (var loop = 0; loop < Columns.length; loop++) { var currColumnName = Columns[loop]; var counter = 1; while(document.getElementById(currColumnName+'Header'+counter)){ var currentArrow = document.getElementById(currColumnName+'Header'+counter); currentArrow.className = 'noArrow'; counter = counter +2; } } var activeColumn = column; var counter = 1; while(document.getElementById(activeColumn+'Header'+counter)){ var activeArrow = document.getElementById(activeColumn+'Header'+counter); if(arrSort[column] == 'ascending') { activeArrow.className = 'ascArrow'; } else { activeArrow.className = 'descArrow'; } counter = counter +2; } } //]]></script> <style> th.noArrow { background-color: #ffffff; text-align: left; } th.ascArrow { background-image: url(images/asc.gif); background-color: #ffffcc; background-repeat: no-repeat; background-position: right; text-align: left; } th.descArrow { background-image: url(images/desc.gif); background-color: #ffffcc; background-repeat: no-repeat; background-position: right; text-align: left; } </style> <title>Bell proof of concept</title> </head> <body onload="sortXML();"> <div id="ChargeableMessages"> <!-- display Chargeable Messages section here --> </div> <xml id="myXMLData" style="display:none;"> <myXMLData xmlns=""> <BTN number="635 5669"> <Section number="400" type="Detail" subHead1="Long distance calls" subHead2=""> <ServiceHeader group=""> <message> <id>1-01</id> <date>2005-04-23</date> <location>Quebec QC</location> <number>418 683 1234</number> <duration>1</duration> <charges>0.43</charges> <savings>.043</savings> <amount /> </message> <message> <id>1-02</id> <date>2005-04-28</date> <location>Montreal QC</location> <number>514 485 6611</number> <duration>2</duration> <charges>3.44</charges> <savings /> <amount /> </message> <message> <id>1-03</id> <date>2005-05-01</date> <location>Winnipeg MB</location> <number>204 475 4565</number> <duration>22</duration> <charges>0.55</charges> <savings /> <amount /> </message> <message> <id>1-04</id> <date>2005-04-01</date> <location>Victoria BC</location> <number>250 361 9433</number> <duration>40</duration> <charges>7.42</charges> <savings /> <amount /> </message> <message> <id>1-05</id> <date>2005-04-18</date> <location>St Jovite QC</location> <number>819 425 3221</number> <duration>2</duration> <charges>0.68</charges> <savings /> <amount /> </message> </ServiceHeader> </Section> <Section number="420" type="Summary"> </Section> <Section number="430c" type="Detail" subHead1="Advantage Per Call" subHead2=""> <ServiceHeader group="Canada"> <message> <id>1-06</id> <date>2005-05-06</date> <location>Collingwood ON</location> <number>705 445 1030</number> <duration>1.4</duration> <charges>5.01</charges> <savings /> <amount /> </message> <message> <id>1-07</id> <date>2005-04-12</date> <location>Erin ON</location> <number>519 833 2380</number> <duration>1.1</duration> <charges>0.78</charges> <savings /> <amount /> </message> <message> <id>1-08</id> <date>2005-04-09</date> <location>Barrie ON</location> <number>705 726 4242</number> <duration>.5</duration> <charges>0.47</charges> <savings /> <amount /> </message> <message> <id>1-09</id> <date>2005-05-09</date> <location>Longueuil QC</location> <number>450 463 7180</number> <duration>1.6</duration> <charges>0.69</charges> <savings /> <amount /> </message> </ServiceHeader> <ServiceHeader group="United States"> <message> <id>1-10</id> <date>2005-05-10</date> <location>Folsom CA</location> <number>916 355 7200</number> <duration>2.4</duration> <charges>2.54</charges> <savings /> <amount /> </message> <message> <id>1-11</id> <date>2005-04-04</date> <location>Burlington MA</location> <number>781 270 1695</number> <duration>6</duration> <charges>10.35</charges> <savings /> <amount /> </message> </ServiceHeader> </Section> <Section number="450c" type="Summary" subHead1="" subHead2=""> </Section> </BTN> <BTN number="635 5670"> <Section number="400" type="Detail" subHead1="Long distance calls" subHead2=""> <ServiceHeader group=""> <message> <id>1-12</id> <date>2005-04-08</date> <location>Edmonton AB</location> <number>780 496 8200</number> <duration>3</duration> <charges>0.25</charges> <savings /> <amount /> </message> <message> <id>1-13</id> <date>2005-04-15</date> <location>Halifax NS</location> <number>902 490 6277</number> <duration>5</duration> <charges>1.01</charges> <savings /> <amount /> </message> <message> <id>1-14</id> <date>2005-04-30</date> <location>Sudbury ON</location> <number>705 671 2489</number> <duration>33</duration> <charges>3.55</charges> <savings /> <amount /> </message> <message> <id>1-15</id> <date>2005-05-07</date> <location>Sault Ste Marie ON</location> <number>705 254 6060</number> <duration>50</duration> <charges>5.66</charges> <savings /> <amount /> </message> </ServiceHeader> </Section> <Section number="420" type="Summary"> </Section> </BTN> </myXMLData> </xml> <xml id="myXSLStylesheet" style="display:none;"> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform <http://www.w3.org/1999/XSL/Transform> " version="1.0"> <xsl:output method="html" /> <xsl:param name="sortKey" /> <xsl:param name="sortOrder" /> <xsl:template match="/"> <xsl:apply-templates select="myXMLData" /> </xsl:template> <xsl:template match="myXMLData"> <xsl:apply-templates select="//BTN" /> </xsl:template> <xsl:template match="//BTN"> <b><xsl:value-of select="@number" /></b> <xsl:for-each select="Section[@type='Detail']"> <table border="1"> <th colspan="6" align="left"> <xsl:value-of select="@subHead1" /> - click on any column to sort </th> <tr> <th class="noArrow"> <xsl:attribute name="id"><xsl:value-of select="'idHeader'"/><xsl:number level="any"/></xsl:attribute> <a href="#" onclick="sortXML(this); showArrow('id'); return false;">ID</a> </th> <th class="noArrow"> <xsl:attribute name="id"><xsl:value-of select="'dateHeader'"/><xsl:number level="any"/></xsl:attribute> <a href="#" onclick="sortXML(this); showArrow('date'); return false;">Date</a> </th> <th class="noArrow"> <xsl:attribute name="id"><xsl:value-of select="'locationHeader'"/><xsl:number level="any"/></xsl:attribute> <a href="#" onclick="sortXML(this); showArrow('location'); return false;">Location</a> </th> <th class="noArrow"> <xsl:attribute name="id"><xsl:value-of select="'numberHeader'"/><xsl:number level="any"/></xsl:attribute> <a href="#" onclick="sortXML(this); showArrow('number'); return false;">Number</a> </th> <th class="noArrow" width="70"> <xsl:attribute name="id"><xsl:value-of select="'durationHeader'"/><xsl:number level="any"/></xsl:attribute> <a href="#" onclick="sortXML(this); showArrow('duration'); return false;">Duration</a> </th> <th class="noArrow" width="70"> <xsl:attribute name="id"><xsl:value-of select="'chargesHeader'"/><xsl:number level="any"/></xsl:attribute> <a href="#" onclick="sortXML(this); showArrow('charges'); return false;">Charges</a> </th> </tr> <xsl:apply-templates select="ServiceHeader" /> </table> <br /> </xsl:for-each> </xsl:template> <xsl:template match="ServiceHeader"> <xsl:if test="@group != '' "> <tr> <td colspan="6"> <xsl:value-of select="@group" /> </td> </tr> </xsl:if> <xsl:choose> <xsl:when test="($sortKey = 'duration') or ($sortKey = 'charges')"> <xsl:apply-templates select="message"> <xsl:sort select="*[name() = $sortKey]" order="{$sortOrder}" data-type="number" /> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="message"> <xsl:sort select="*[name() = $sortKey]" order="{$sortOrder}" data-type="text" /> </xsl:apply-templates> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="message"> <tr> <td> <xsl:value-of select="id" /> </td> <td> <xsl:value-of select="date" /> </td> <td> <xsl:value-of select="location" /> </td> <td> <xsl:value-of select="number" /> </td> <td> <xsl:value-of select="duration" /> </td> <td> <xsl:value-of select="charges" /> </td> </tr> </xsl:template> </xsl:stylesheet> </xml> </body> </html>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Passing sort parameter as a h, Maria Amuchastegui | Thread | [xsl] Cannot select a node here: , Jim_Albright |
Re: [xsl] XSLT for usable yet valid, Robert Koberg | Date | Re: [xsl] XSLT for usable yet valid, David Carlisle |
Month |