I have a single .xhtml file that contains an embedded XML data island and an
embedded XSL stylesheet. A Javascript function, sortXML(), transforms the
data using sort parameters passed to the stylesheet, and toggles between
ascending and descending sort orders. I had to rewrite sortXML() so that it
passes the column parameter as a hard-coded string instead of picking it up
from the innerHTML, and now the sort functionality isn't working. I don't
understand why the sort it isn't working any more.
<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
<http://www.experts-exchange.com/Web/Web_Languages/JavaScript/Q_21377372.htm
l#> Array();
arrSort["id"] = "ascending";
arrSort["date"] = "ascending";
arrSort["location"] = "ascending";
arrSort["number"] = "ascending";
arrSort["charges"] = "ascending";
arrSort["savings"] = "ascending";
arrSort["amount"] = "ascending";
function sortXML(column)
{
var column = "id";
var order = "ascending";
//if(theLink)
// {
// column = theLink.innerHTML.toLowerCase();
if (arrSort[column] == 'ascending')
{
order = 'descending';
}
else
{
order = 'ascending';
}
arrSort[column] = order;
showArrow(column);
// }
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+'Arrow'+counter)){
var currentArrow =
document.getElementById(currColumnName+'Arrow'+counter);
currentArrow.style.visibility = "hidden";
counter++;
}
}
var activeColumn = column;
var counter = 1;
while(document.getElementById(activeColumn+'Arrow'+counter)){
var activeArrow =
document.getElementById(activeColumn+'Arrow'+counter);
if(activeArrow.className == 'ascArrow')
{
activeArrow.className = 'descArrow';
activeArrow.style.visibility = "visible";
}
else
{
activeArrow.className = 'ascArrow';
activeArrow.style.visibility = "visible";
}
counter++;
}
}
//]]></script>
<style>
.ascArrow
{
background: #ffffff
<http://www.experts-exchange.com/Web/Web_Languages/JavaScript/Q_21377372.htm
l#> url(images/asc.gif) no-repeat;
width: 8px;
height: 4px;
}
.descArrow
{
background: #ffffff url(images/desc.gif) no-repeat;
width: 8px;
height: 4px;
}
</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>
<SummarySection number="420" type="Summary">
</SummarySection>
<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>
<SummarySection number="450c" type="Summary"
subHead1="" subHead2="">
</SummarySection>
</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>
<SummarySection number="420" type="Summary">
</SummarySection>
</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[(_at_)type='Detail']">
<table border="1">
<th colspan="6" align="left">
<xsl:value-of select="@subHead1" />
- click on any column to sort
</th>
<tr>
<th>
<a href="#" onclick="return
sortXML('id');">ID
<span class="ascArrow"
style="visibility:visible;">
<xsl:attribute
name="id"><xsl:value-of select="'idArrow'" /><xsl:number
level="any"/></xsl:attribute>
<xsl:text> </xsl:text>
</span>
</a>
</th>
<th>
<a href="#" onclick="return
sortXML('date');">Date
<span class="ascArrow"
style="visibility:hidden;">
<xsl:attribute
name="id"><xsl:value-of select="'dateArrow'" /><xsl:number
level="any"/></xsl:attribute>
<xsl:text> </xsl:text>
</span>
</a>
</th>
<th>
<a href="#" onclick="return
sortXML('location');">Location
<span class="ascArrow"
style="visibility:hidden;">
<xsl:attribute
name="id"><xsl:value-of select="'locationArrow'" /><xsl:number
level="any"/></xsl:attribute>
<xsl:text> </xsl:text>
</span>
</a>
</th>
<th>
<a href="#" onclick="return
sortXML('number');">Number
<span class="ascArrow"
style="visibility:hidden;">
<xsl:attribute
name="id"><xsl:value-of select="'numberArrow'" /><xsl:number
level="any"/></xsl:attribute>
<xsl:text> </xsl:text>
</span>
</a>
</th>
<th>
<a href="#" onclick="return
sortXML('duration');">Duration
<span class="ascArrow"
style="visibility:hidden;">
<xsl:attribute
name="id"><xsl:value-of select="'durationArrow'" /><xsl:number
level="any"/></xsl:attribute>
<xsl:text> </xsl:text>
</span>
</a>
</th>
<th>
<a href="#" onclick="return
sortXML('charges');">Charges
<span class="ascArrow"
style="visibility:hidden;">
<xsl:attribute
name="id"><xsl:value-of select="'chargesArrow'" /><xsl:number
level="any"/></xsl:attribute>
<xsl:text> </xsl:text>
</span>
</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>
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--