Re: [xsl] Multiple matches against keys?

Subject: Re: [xsl] Multiple matches against keys?
From: "Ramon M. Felciano @ Yahoo" <felciano@xxxxxxxxx>
Date: Wed, 01 Sep 2004 19:14:33 -0700
Kevin Jones wrote:

So it looks like my key definition is no longer picking up "call" as a
valid key item. I'm actually not sure whether I'm using the <xsl:key>
tag correctly here -- will it match and index a single <task> node
multiple times if it contains multiple tags?




I think your problem is that you are passing a nodeset to the key call so that it retruns results from different 'context' sets. This means you can't use the count(.|key(...)[1])=1 trick to isolate the first from a particular 'context'. One way to fix is is to loop both over the 'task' and then the child 'context' elements and apply the same test. Something like this should work,


<xsl:for-each select="/tasks/task">
<xsl:sort select="subject"/>
<xsl:for-each select="context">
 <xsl:if test="count((..|key('tasks-by-context',.)[1]))=1">
  <li>
   CONTEXT: <xsl:value-of select="."/>: (<xsl:value-of
	select="count(key('tasks-by-context',.))"/> tasks)
  </li>
  <ul>
   <xsl:for-each select="key('tasks-by-context', .)">
    <li>
      Task : <xsl:value-of select="subject"/>
    </li>
   </xsl:for-each>
  </ul>
 </xsl:if>
</xsl:for-each>
</xsl:for-each>

Kev.

Hi Kev --

This is almost right -- it gives me the right grouping, but the sort order is wrong. How can I get that outer loop to sort the contexts alphabetically? Do I need to make the outer loop iterate over the sorted contexts first?

Thanks!

Ramon

Current Thread