RE: [xsl] Passing sort parameter as a hard-coded string

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