Re: [xsl] Subject: Counting Path Occurrences

Subject: Re: [xsl] Subject: Counting Path Occurrences
From: "Scott Coon" <scoon@xxxxxxxxxxxxx>
Date: Tue, 3 Apr 2007 19:07:58 -0700
> On 4/1/07, Mukul Gandhi <gandhi.mukul@xxxxxxxxx> wrote:
> > On 3/30/07, Andrew Welch <andrew.j.welch@xxxxxxxxx> wrote:
>
> >    <xsl:for-each-group
> >      select="//*/string-join(ancestor-or-self::*/name(), '/')"
> >      group-by=".">
> >          <xsl:sequence select="concat('&#xa;', ., ' - ',
count(current-group()))"/>
> >    </xsl:for-each-group>
>
>
> Nice solution.
>
> Except, if we change slightly the concat to following (please note a
> starting '/'):
> concat('&#xa;', '/', ., ' - ', count(current-group()))
>
>
> We'll get exactly what the OP wants.


So, just to make sure I understand this right, for each descendent node,
you use this string-join function to build the full path via the
ancestors:

 -- string-join(ancestor-or-self::*/name(), '/')

Since you're doing this in the select clause of the for-each-group, the
things to be grouped are already the desired paths, so you just group-by
".".  And for the same reason, you can use "." in the concat clause to
format the output.

I would also get the same result by separating things like this, right?

<xsl:for-each-group select="//*"
group-by="string-join(ancestor-or-self::*/name(), '/')">
[blah....]
</xsl:for-each-group>

Guys, this is terrific.  Thanks very much for the prompt replies.

Scott

Current Thread