xsl-list
[Top] [All Lists]

RE: Using not(...a nd ... ) to select nodes

2003-07-10 14:47:55
Wendell,

This is something that's been fuzzy in my mind for a while...

In order for your code to work, current() in the select expression
of a for-each loop must refer to the <item> node currently being
tested for whether it gets selected, right?
If so, is this the way xsl:for-each / xpath work?
I realize that INSIDE the for-each, current() refers to the node
currently being processed, but is that also true in the select
expression of the for-each? Or does current() there refer to
the context node outside the for-each?

Thanks,
Lars

Chris,

Try

select="items/item[not(preceding-sibling::*
   [name=current()/name and
    type = current()/type and
   status = current()/status])]"

The problem with your statement is it's testing true if there no 
corresponding values on any preceding siblings, whereas you 
want it to be 
true only if there's a preceding sibling with all 
corresponding values.

I thought the same thing... but if that's the case I can't figure
out why he's getting only the second and third items.  I would have
thought the first one would have been selected since it doesn't
have any preceding siblings.

Chris wrote:
I'm using the following to select the nodes:

<xsl:for-each select="items/item[not(name = preceding-sibling::*/name
and type = preceding-sibling::*/type and status =
preceding-sibling::*/status)]">


An example from the XML might be: truck,silverado,chevy,on
truck,silverado,chevy,off truck,ranger,ford,on  truck,silverado,chevy,on
truck,silverado,chevy,off

From that I want to see the first three in a node set.  However, what
I'm getting are the second and third ones.

Any suggestions would be much appreciated.

I think you probably need to do Muenchian grouping using a composite
key on name, type, and status.
See http://www.dpawson.co.uk/xsl/sect2/N4486.html

HTH,
Lars


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