RE: [xsl] xsl needed: sibilings with different parents

Subject: RE: [xsl] xsl needed: sibilings with different parents
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Wed, 8 Sep 2004 08:36:04 +0100
> ><xsl:for-each select="BB/BB1">
> ><xsl:copy-of
> >select="/root/AA/AA1[/BB/BB1[position()]]"/>
> ></xsl:for-each>
> 
> You are using position() as a standalone expression for a 
> predicate.  All 
> predicates are converted to boolean true()/false() before they are 
> used.  The position() function always returns a positive 
> number, hence will 
> always be converted to boolean true().  This qualifies all 
> BB1 children of 
> BB that may be present.

Ken is right that [position()] won't work, but he hasn't explained the
reason very clearly. Any predicate that is the numeric value [N] is treated
as shorthand for [position()=N], so the predicate [position()] is short for
[position()=position()] which of course is always true.

Generally speaking, any operation involving combining or comparing two
node-sets needs variables, except for a limited class of joins that can be
handled using the implicit existential semantics of operators like "=".
Perhaps someone better versed in predicate logic than I am can explain why
this is true.

Michael Kay

Current Thread