Re: [xsl] Select nodes with equal position

Subject: Re: [xsl] Select nodes with equal position
From: Midsummer Sun <midsummer.sun@xxxxxxxxx>
Date: Sun, 3 Apr 2005 01:01:41 +0530
Hi David,
  I have a very basic question.

Why this should not work -
<xsl:template match="entry">
  <xsl:value-of select="../../colspec[position()]/@colname"/>

My doubt came because..
If we use 
<xsl:value-of select="../../colspec[2]/@colname"/>
i.e. if we use a static number as predicate of colspec , it expectedly
gets(to my expectation!) the 2nd colspec child of table.

But should'nt this <xsl:value-of select="../../colspec[position()]/@colname"/>
do the same thing? 

If I run this program:
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl=""; version="1.0">
 <xsl:output method="text" />  

 <xsl:template match="/">
   <xsl:apply-templates select="table/row/entry" />
<xsl:template match="entry">
  <xsl:value-of select="../../colspec[position()]/@colname"/>

With XML:
 <colspec colname="c1"/>
 <colspec colname="c2"/>
 <colspec colname="c3"/>
   <entry colname="c1">r1_1</entry>
   <entry colname="c2">r1_2</entry>
   <entry colname="c3">r1_2</entry>

The output is c1c1c1 . i.e. the instruction <xsl:value-of
select="../../colspec[position()]/@colname"/> always picks element
<colspec colname="c1"/> (i.e. 1st one)..

This amazes me.. Can you please clarify the rationale behind the
complex expression you wrote. And why simply [position()] should not

Best regards,

> If you really object to variables
>  <xsl:value-of select="../../colspec[position() = count(current()/preceding-sibling::entry)+1]/@colname"/>
> but that's likely to be slower
> David
> ________________________________________________________________________
> This e-mail has been scanned for all viruses by Star. The
> service is powered by MessageLabs. For more information on a proactive
> anti-virus service working around the clock, around the globe, visit:
> ________________________________________________________________________

Current Thread