[xsl] Re: Unique question

Subject: [xsl] Re: Unique question
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Fri, 5 Oct 2001 00:06:37 -0700 (PDT)
Good Morning,

Now, when I'm completely awake, I see that the problem was to count the unique
"index" attributes ***within a group***.

Certainly, the solution to this is slightly different:

First we define a key:

<xsl:key name="kIndex" match="@index" 
                       use="concat(generate-id(../../..), '~',.)"/>

Then if $x contains the position of the "group", for which we need to know the count
of unique "index" attributes, the following XPath expression returns this count:

count(
/groups/group[$x]/*/*/@index[generate-id() 
                            = 
                             generate-id(key('kIndex', 
                                              concat(generate-id(/groups/group[$x]),
                                                     '~',
                                                     .)
                                             )[1]
                                          )
                             ]
     )


Using the source xml provided, this returns:

4  --- when $x = 1 

1  --- when $x = 2


Cheers,
Dimitre Novatchev.

--- Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote:
> Or you can just use:
> 
> <xsl:value-of select="count(/*/*/*/*/@index
>                           [generate-id()
>                           =
>                            generate-id(key('kIndex', .)[1])])"/>
> 
> Cheers,
> Dimitre Novatchev.
> 
> --- Dimitre Novatchev <dnovatchev@xxxxxxxxx> wrote:
> > Hi Daren,
> > 
> > This is a short solution:
> > 
> > <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> >   <xsl:output method="text"/>
> >   <xsl:key name="kIndex" match="@index" use="."/>
> >   <xsl:template match="/">
> >     <xsl:variable name="x">
> >        <xsl:for-each select="/*/*/*/*/@index
> >                           [generate-id()
> >                           =
> >                            generate-id(key('kIndex', .)[1])]">
> >             <xsl:value-of select="'Z'"/>
> >        </xsl:for-each>
> >     </xsl:variable>
> >     
> >     <xsl:value-of select="string-length($x)"/>
> >   </xsl:template>
> > </xsl:stylesheet>
> > 
> > It produces:
> > 
> > 4
> > 
> > with the corrected version of your xml source (it was not well-formed):
> > 
> > <groups>
> >   <group>
> >     <tables>
> >       <table index="1" />
> >       <table index="2" />
> >     </tables>
> >     <views>
> >       <view index="3" />
> >       <view index="4" />
> >     </views>
> >   </group>
> >   <group>
> >     <tables>
> >       <table index="1" />
> >     </tables>
> >     <views>
> >       <view index="1" />
> >     </views>
> >   </group>
> > </groups>
> > 
> > Hope this helped.
> > 
> > Cheers,
> > Dimitre Novatchev.
> > 
> > 
> > Darren Hayduk <dhayduk at nauticusnet dot com> wrote:
> > 
> > I'm trying to take the XPath expression "*/*/@index" and determine how many
> > unique vales there are - within my current context.
> > I've tried various axis expressions and can't seem to figure it out... I'd
> > be happy with either: 
> > A. the ability to count the unique nodes (and I'll compare to count of all
> > nodes)
> > B. just knowing there are duplicates.
> > 
> > Example: Within each group, the table and view indexes need to be unique.
> > Data in first group is OK, the 'view' in the second group is a duplicate...
> > 
> > <group>
> > 	<tables>
> > 		<table index="1"/>
> > 		<table index="2"/>
> > 	</tables/>		
> > 	<views>
> > 		<view index="3"/>
> > 		<view index="4"/>
> > 	</views/>		
> > </group>
> > <group>
> > 	<tables>
> > 		<table index="1"/>
> > 	</tables/>		
> > 	<views>
> > 		<view index="1"/>
> > 	</views/>		
> > </group>
> > 
> > 
> > 
> > 
> > __________________________________________________
> > Do You Yahoo!?
> > NEW from Yahoo! GeoCities - quick and easy web site hosting, just $8.95/month.
> > http://geocities.yahoo.com/ps/info1
> > 
> 
> 
> __________________________________________________
> Do You Yahoo!?
> NEW from Yahoo! GeoCities - quick and easy web site hosting, just $8.95/month.
> http://geocities.yahoo.com/ps/info1
> 


__________________________________________________
Do You Yahoo!?
NEW from Yahoo! GeoCities - quick and easy web site hosting, just $8.95/month.
http://geocities.yahoo.com/ps/info1

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread