xsl-list
[Top] [All Lists]

RE: Multiple matches against keys?

2004-09-01 19:36:26
You could use the distinct function if libxslt supports it to first get the 
list of distinct context elements sorted on the context element and then for 
each context element, do what you are doing.

<!- iterate over each distinct context in sorted order ->
<xsl:for-each select="distinct(//context)">
 <xsl:sort select="."/>

   <xsl:variable name="contextVal" select="."/>
   <li>
    CONTEXT: <xsl:value-of select="$contextVal"/>: (<xsl:value-of
        select="count(key('tasks-by-context',$contextVal))"/> tasks)
   </li>
   <ul>
    <xsl:for-each select="key('tasks-by-context', $contextVal)">
     <li>
       Task : <xsl:value-of select="subject"/>
     </li>
    </xsl:for-each>
   </ul>

</xsl:for-each>

-Vasu

-----Original Message-----
From: Ramon M. Felciano @ Yahoo [mailto:felciano(_at_)yahoo(_dot_)com]
Sent: Wednesday, September 01, 2004 7:15 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Multiple matches against keys?


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

--+------------------------------------------------------------------
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>
--+--



----+----
This email message (and any attached document) contains information from 
Ingenuity Systems Inc. which may be considered confidential by Ingenuity, or 
which may be privileged or otherwise exempt from disclosure under law, and is 
for the sole use of the individual or entity to whom it is addressed.  Any 
other dissemination, distribution or copying of this message is strictly 
prohibited.  If you receive this message in error, please notify me and destroy 
the attached message (and all attached documents) immediately. 


<Prev in Thread] Current Thread [Next in Thread>