RE: [xsl] Xpath - count preceding-siblings matching some condition

Subject: RE: [xsl] Xpath - count preceding-siblings matching some condition
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 30 Apr 2007 21:23:05 +0100
When you create a sequence of elements using:

<xsl:variable name="v" as="element()+">
  <a/>
  <a/>
  <a/>
</xsl:variable>

then the elements in the resulting sequence are not siblings. They are
parentless, whereas siblings always share a parent. To make them siblings
you need to add a document node, which you can do simply by leaving out the
"as" attribute:

<xsl:variable name="v">
  <a/>
  <a/>
  <a/>
</xsl:variable> 

Michael Kay
http://www.saxonica.com/



> -----Original Message-----
> From: Angela Williams [mailto:Angela.Williams@xxxxxxxxxxxxxxxxxx] 
> Sent: 30 April 2007 21:00
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] Xpath - count preceding-siblings matching 
> some condition
> 
> This works great in my test stylesheet.  However, when I use 
> this in my real stylesheet, I end up with 1 group, so all 
> rows have a row-nbr=1.
> 
> The only difference in my real stylesheet is how I build $tmp-table.
> Instead of selecting from a static node tree, it is built in 
> memory with the <xsl:variable name="tmp-table" as="element()+">
>   <!-- build the data -->
> </xsl:variable>
> 
> I've tried writing out the data instead of putting it in a 
> variable, and then using that output as input for the test 
> stylesheet and it works!?!
> 
> Is there something different about holding the temporary tree 
> in memory to process it, as opposed to selecting from a 
> static file?  When I view the $tmp-table variables in the 
> debugger, my node-sets look exactly the same in both real and 
> test stylesheets.
> 
> I'm going cross-eyed - any suggestions?
> 
> Thanks!
> Angela 
> 
> -----Original Message-----
> From: Angela Williams
> Sent: Monday, April 30, 2007 1:35 PM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] Xpath - count preceding-siblings matching 
> some condition
> 
> That's wonderful!
> 
> Thanks!
> Angela 
> 
> -----Original Message-----
> From: Bjorndahl, Brad [mailto:brad.bjorndahl@xxxxxxxxxxxxxxxx]
> Sent: Monday, April 30, 2007 1:19 PM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] Xpath - count preceding-siblings matching 
> some condition
> 
> How about:
> 
> <table>
>   <xsl:for-each-group select="//data/a" 
> group-starting-with="a[@col-nbr lt 
> preceding-sibling::a[1]/@col-nbr]" >
>     <xsl:variable name="row" select="position()" />
>     <xsl:for-each select="current-group()" >
>       <b col-nbr="{@col-nbr}" row-nbr="{$row}" />
>     </xsl:for-each>
>  </xsl:for-each-group>
> </table> 
> 
> Brad.

Current Thread