XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Shaunna SheltonSubject: Dynamic Sorting with XSL
Author: Shaunna Shelton
Date: 11 May 2005 06:33 PM
I have the following XSL stylesheet transforming an XML file. This is being done via ColdFusion which utilizes Xalan, as I understand it.

The sorting is harcoded, but I need to figure out how to make it dynamic - so that when a user clicks one of the headings (File Name, Author, etc) it will sort the data by whatever option they chose. I understand you must declare a parameter and then test for the parameter's value, but am not sure of the syntax. I would be passing the parameter in a query string like so, ?sortby=FileName.

Any direction is much appreciated:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" />

<xsl:template match="/documents" >
<html>
<head><title>Master List</title></head>
<body>
<div class="TableContainer">
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="ContentTable">
<tr>
<td class="ContentTitle" colspan="6">Documents</td>
</tr>
<tr>
<th><a href="displayXML.cfm?sortby=FileName">File Name</a></th>
<th><a href="displayXML.cfm?sortby=Created">Created</a></th>
<th><a href="displayXML.cfm?sortby=Modified">Last Modified</a></th>
<th><a href="displayXML.cfm?sortby=Title">Title</a></th>
<th><a href="displayXML.cfm?sortby=Author">Original Author</a></th>
<th><a href="displayXML.cfm?sortby=Editor">Last Editor</a></th>
</tr>
<xsl:for-each select="document">
<xsl:sort select="Author" />
<tr>
<td><xsl:value-of select="@FILENAME" /></td>
<td><xsl:value-of select="Creation_date" /></td>
<td><xsl:value-of select="@MODIFIEDDATE" /></td>
<td><xsl:value-of select="Title" /></td>
<td><xsl:value-of select="Author" /></td>
<td><xsl:value-of select="Last_author" /></td>
</tr>
</xsl:for-each>
</table>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


Postnext
Ivan PedruzziSubject: Dynamic Sorting with XSL
Author: Ivan Pedruzzi
Date: 12 May 2005 06:57 PM
Hi Shaunna

You can get close to what you have described with the following solution.
Test the XSLT with the books.xml sample to see how it works.

Hope this Helps
Ivan Pedruzzi
Stylus Studio Team

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="sort-by" select="'title'"/>

<xsl:template match="/">
<root>
<xsl:for-each select="books/book">
<xsl:sort select="*[local-name() = $sort-by]"/>
<xsl:element name="{$sort-by}">
<xsl:value-of select="*[local-name() = $sort-by]"/>
</xsl:element>
</xsl:for-each>
</root>
</xsl:template>

</xsl:stylesheet>

Posttop
Shaunna SheltonSubject: Dynamic Sorting with XSL
Author: Shaunna Shelton
Date: 13 May 2005 10:44 AM
I came up with this last night after reading a tutorial here: http://pascal.soulshine.de/projects/articles/xsl_table/

However, thought it looks correct to me, it's still not sorting for some reason. Can anyone see anything obviously wrong?


<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />

<xsl:param name="smode" />

<xsl:template match="documents">
<html>
<head>
<title>Documents</title>
</head>
<body>
<xsl:call-template name="document" />
</body>
</html>
</xsl:template>

<xsl:template name="sorting">
<xsl:choose>
<xsl:when test="contains($smode, 'FileName')">
<xsl:apply-templates>
<xsl:sort select="@FILENAME" order="descending" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="contains($smode, 'Created')">
<xsl:apply-templates>
<xsl:sort select="Creation_date" order="descending" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="contains($smode, 'Modified')">
<xsl:apply-templates>
<xsl:sort select="@MODIFIEDDATE" order="descending" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="contains($smode, 'Title')">
<xsl:apply-templates>
<xsl:sort select="Title" order="descending" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="contains($smode, 'Author')">
<xsl:apply-templates>
<xsl:sort select="Author" order="descending" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="contains($smode, 'Editor')">
<xsl:apply-templates>
<xsl:sort select="Last_Author" order="descending" />
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates />
</xsl:otherwise>
</xsl:choose>
</xsl:template>


<xsl:template name="document">
<div class="TableContainer">
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="ContentTable">
<tr>
<td class="ContentTitle" colspan="6">Documents</td>
</tr>
<tr>
<th><a href="displayXML.cfm?sortby=FileName">File Name</a></th>
<th><a href="displayXML.cfm?sortby=Created">Created</a></th>
<th><a href="displayXML.cfm?sortby=Modified">Last Modified</a></th>
<th><a href="displayXML.cfm?sortby=Title">Title</a></th>
<th><a href="displayXML.cfm?sortby=Author">Original Author</a></th>
<th><a href="displayXML.cfm?sortby=Editor">Last Editor</a></th>
</tr>
<tbody>
<xsl:call-template name="sorting" />
</tbody>
</table>
</div>
</xsl:template>

<xsl:template match="document" name="srow">
<tr>
<td><xsl:value-of select="current()/@FILENAME" /></td>
<td><xsl:value-of select="current()/Creation_date" /></td>
<td><xsl:value-of select="current()/@MODIFIEDDATE" /></td>
<td><xsl:value-of select="current()/Title" /></td>
<td><xsl:value-of select="current()/Author" /></td>
<td><xsl:value-of select="current()/Last_author" /></td>
</tr>

</xsl:template>
</xsl:stylesheet>

Ivan, thanks for the tip. I'll have to try and see if I can get your method to work if I can't get this functioning.


DocumentdocumentXML.xml
XML document

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.