Re: [xsl] Help on node selection

Subject: Re: [xsl] Help on node selection
From: Lars Huttar <lars_huttar@xxxxxxx>
Date: Fri, 27 Aug 2010 11:42:20 -0500
 On 8/27/2010 6:42 AM, Fabien Tillier wrote:
> I want to first process nodes which have N1 = 1, then nodes with N1=2. But I want to call the template only once with all matching nodes (so once with N1=1 nodes, and once with N1=2 nodes), because I am building a group from these
> Thus, I have tried with 
>
> <xsl:apply-templates select="//row[N1=1]" mode="headers"/>
>
> But my template
>
> <xsl:template match="row" mode="headers">
>                 Headers              
> </xsl:template>
>
> Is called on each matching node...(thus 3 times here), rather than once, and then gets some loop to individually treat each node from the list.
> How can I proceed ?

If you are using XSLT 2.0, your outer template can say
<myDoc>
<xsl:for-each-group select="//row" group-by="N1">
  <!-- this loop body is instantiated once for each group, e.g. N1=1 -->
  <xsl:element name="N1is{N1}">
    <xsl:for-each select="current-group()">
       <!-- this inner loop body is instantiated once for each row of
the N1=1 group -->
       <xsl:value-of select="N2" />,
    </
  </
</
</myDoc>

And you get output like
<myDoc>
  <N1is1>120, 120, 110</N1is1>
  <N1is2>120, 120</N1is2>
</myDoc>

(untested)

Is that clearer?

Lars

Current Thread