Re: [xsl] finding position() in xpath 1.0

Subject: Re: [xsl] finding position() in xpath 1.0
From: Abel Braaksma <abel.online@xxxxxxxxx>
Date: Mon, 19 Mar 2007 13:56:42 +0100
Abel Braaksma wrote:
Frank Marent wrote:
hi all

i have to find an xpath 1.0 expression (unfortunately no way around) that selects all elements CELL that have in the following ROW a CELL with an attribute @test='yes' *and* the same position.

<ROW>
  <CELL/>
  <CELL/>   <-- select this and only this
  <CELL/>
</ROW>
<ROW>
  <CELL/>
  <CELL test="yes"/>
  <CELL/>
</ROW>
<ROW>
  <CELL/>
  <CELL/>
  <CELL/>
</ROW>

phew. how can i do that in xpath 1.0? i tried this one:

//CELL[../following-sibling::*[1]/CELL[position()=count(current()/preceding-sibling::CELL)+1]/@text='yes']



Hi Frank, long time no see ;) From withing 'ROW' scope, can you not simply use a variable? I.e.:

<xsl:variable name="pos" select="count(following-sibling::ROW[1]/CELL[@test='yes']/preceding-sibling::CELL) + 1" />
<xsl:apply-templates select="CELL[$pos]" />


not tested, however.

Here's a better one. The ' + 1' makes it go wrong, you need to count the actual CELLs, so as to receive '0' when there's nothing there:


<xsl:template match="ROW">
<xsl:variable name="preselect"
select="following-sibling::ROW[1]/CELL[@test='yes']" />
<xsl:variable name="pos" select="
count($preselect/preceding-sibling::CELL) +
count($preselect)" />
<xsl:copy-of select="CELL[$pos]" />
</xsl:template>




Cheers,
-- Abel

Current Thread