Hi all,
I need to provide a sorting functionality where users
can select the first and/or secondary sorting columns
and specify their orders.
I captured the sorting headers, sorting orders, and
sorting datatype and stored them as parameters
correctly. I get the correct sorting for most of the
column headers except for the one for 'broken' (it
doesn't seem to sort at all):-( Any help would be
greatly appreciated. Many thanks in advance.
Here are some simplified xml I worked on:
<server ip="192.168.0.4:8080">
<num>0</num>
<max>22</max>
<rules>
<rule name="broken">0</rule>
</rules>
</server>
Here are some simplified xsl which performed sorting
based on params:
<!-- interpret the column head and some columns call
for double sorting by itself, such as users (num
first, max next, ^ as delimit) -->
<xsl:template name="convert_path">
<xsl:param name="fieldname"/>
<xsl:choose>
<xsl:when test="$fieldname =
'users'">num^max</xsl:when>
<xsl:when test="$fieldname = 'ip'">@ip</xsl:when>
<xsl:when test="$fieldname =
'broken'">rules/rule[(_at_)name = 'broken']</xsl:when>
<xsl:when test="$fieldname = 'any'">any</xsl:when>
</xsl:choose>
</xsl:template>
<!-- double sort -->
<xsl:template name="sort_field">
<!-- first sorting -->
<xsl:param name="field1_path">
<xsl:call-template name="convert_path">
<xsl:with-param name="fieldname" select="$sort1"/>
</xsl:call-template>
</xsl:param>
<!-- second sorting -->
<xsl:param name="field2_path">
<xsl:call-template name="convert_path">
<xsl:with-param name="fieldname" select="$sort2"/>
</xsl:call-template>
</xsl:param>
<xsl:choose>
<xsl:when test="$field2_path = 'any' and
not(contains($field1_path, '^'))">
<xsl:apply-templates select="$T_SERVERS">
<!-- this way doesn't work for "broken" field, but
works for all other fields-->
<xsl:sort select="*[name() = $field1_path] |
@*[concat('@',name()) = $field1_path]"
order="{$order1}" data-type="{$sort1_type}"/>
<!-- this way works though for "broken" field though,
but I don't use it because I need to keep it
generic-->
<!--<xsl:sort select="rules/rule[(_at_)name = 'broken']"
order="{$order1}" data-type="{$sort1_type}"/>-->
</xsl:apply-templates>
</xsl:when>
<!-- any suggestions of making this template shorter
and more elegant are greatly appreciated -->
<xsl:when test="$field2_path = 'any' and
contains($field1_path, '^')">
<xsl:apply-templates select="$T_SERVERS">
<xsl:sort
select="*[name()=substring-before($field1_path, '^')]"
order="{$order1}" data-type="{$sort1_type}"/>
<xsl:sort
select="*[name()=substring-after($field1_path, '^')]"
order="{$order1}" data-type="{$sort1_type}"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="contains($field1_path, '^')">
<xsl:apply-templates select="$T_SERVERS">
<xsl:sort
select="*[name()=substring-before($field1_path, '^')]"
order="{$order1}" data-type="{$sort1_type}"/>
<xsl:sort
select="*[name()=substring-after($field1_path, '^')]"
order="{$order1}" data-type="{$sort1_type}"/>
<xsl:sort select="*[name() = $field2_path] |
@*[concat('@',name()) = $field2_path]"
order="{$order2}" data-type="{$sort2_type}"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="contains($field2_path, '^')">
<xsl:apply-templates select="$T_SERVERS">
<xsl:sort select="*[name() = $field1_path] |
@*[concat('@',name()) = $field1_path]"
order="{$order1}" data-type="{$sort1_type}"/>
<xsl:sort
select="*[name()=substring-before($field2_path, '^')]"
order="{$order2}" data-type="{$sort2_type}"/>
<xsl:sort
select="*[name()=substring-after($field2_path, '^')]"
order="{$order2}" data-type="{$sort2_type}"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="$T_SERVERS">
<xsl:sort select="*[name() = $field1_path] |
@*[concat('@',name()) = $field1_path]"
order="{$order1}" data-type="{$sort1_type}"/>
<xsl:sort select="*[name() = $field2_path] |
@*[concat('@',name()) = $field2_path]"
order="{$order2}" data-type="{$sort2_type}"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Thanks,
-FA
__________________________________________________
Do you Yahoo!?
Yahoo! Web Hosting - establish your business online
http://webhosting.yahoo.com
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list