Reputation: 313
My code below seems logical however i don't know why the sorting doesn't work with the error "Variable or parameter 'sort' is undefined.'"? Im suspecting there are something wrong with declaring param in xsl. Could anyone point my mistake? thanks
java code to pass parameter
String sort = "rating";
transformer.setParameter("sort", sort); /It will control the sort in xsl
xml file
<?xml version="1.0" ?>
<cd>
<title>A Funk Odyssey</title>
<artist>Jamiroquai</artist>
<tracklist>
<track id="1">
<title>Feels So Good</title>
<time>4:38</time>
<rating>2</rating>
</track>
<track id="2">
<title>Little L</title>
<time>4:10</time>
<rating>5</rating>
</track>
<track id="3">
<title>You Give Me Something</title>
<time>5:02</time>
<rating>3</rating>
</track>
<track id="4">
<title>Corner of the Earth</title>
<time>3:57</time>
<rating>1</rating>
</track>
</tracklist>
</cd>
This is my xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:param name="sort" select="title"/>
<xsl:template match="/">
<table border="1">
<thead>
<tr>
<th><a href="#">Title</a></th>
<th><a href="#">Time</a></th>
<th><a href="#">Rating</a></th>
</tr>
</thead>
<tbody>
<xsl:for-each select="cd/tracklist/track">
<xsl:sort select="$sort"/>
<tr>
<td><xsl:value-of select="title" /></td>
<td><xsl:value-of select="time" /></td>
<td><xsl:value-of select="rating" /></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
</xsl:stylesheet>
Upvotes: 1
Views: 1800
Reputation: 6105
In your xsl:param
declaration you are trying to default to $sort
which is not defined at the time xsl:param
is evaluated. It does look like a reference to itself.
If you don't need a default then just change your parameter declaration to:
<xsl:param name="sort"/>
or default to a string value:
<xsl:param name="sort" select="'title'"/>
or
<xsl:param name="sort">title</xsl:param>
That said, we have only addressed the parameter declaration issue. Now on to sorting. The xsl:sort
needs an expression, it won't convert a string value into XPath like you expect it to.
Here's a solution: Using Variables in <xsl:sort select=""/>
.
You would basically do something like:
<xsl:sort select="*[name() = $sort]"/>
Upvotes: 4