RE: [xsl] Apply Template based on position or count

Subject: RE: [xsl] Apply Template based on position or count
From: "Josh Canfield" <Josh.Canfield@xxxxxxxxxxxx>
Date: Fri, 6 Feb 2004 13:10:57 -0800
position() + 1 will return a number, in this case 4. I think what he wants the next node, which can be retrieved using:

following-sibling::*[1]

I have to agree that the <tr/> looks like a typo, why do you want an empty tr element? Changing the match to AAA/BBB, and using the supplied XML I get the following output:

<table width="200" border
   <tr></tr>
   <td valign="top"></td>
   <td valign="top"></td>
   <td valign="top"></td>
   <td valign="top"></td>
   <tr></tr>
   <tr></tr>
   <td valign="top"></td>
   <td valign="top"></td>
   <td valign="top"></td>
   <td valign="top"></td>
   <tr></tr>
   <tr></tr>
   <td valign="top"></td>
   <td valign="top"></td>
</table>

Try this template:

<xsl:template match="/">
<table width="200" border="1">
<xsl:for-each select="AAA/BBB">
  <xsl:if test="position() mod 2 = 1">
    <tr>
      <td valign="top"><xsl:value-of select="@prop"/></td>
      <td valign="top"><xsl:value-of select="following-sibling::*[1]/@prop"/></td>
    </tr>
  </xsl:if>
</xsl:for-each>
</table>
</xsl:template>

output is:

<table width="200" border="1">
   <tr>
      <td valign="top">1</td>
      <td valign="top">2</td>
   </tr>
   <tr>
      <td valign="top">3</td>
      <td valign="top">4</td>
   </tr>
   <tr>
      <td valign="top">5</td>
      <td valign="top">6</td>
   </tr>
</table>

Enjoy,
Josh

-----Original Message-----
From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
[mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of Kenny Akridge
Sent: Friday, February 06, 2004 6:41 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] Apply Template based on position or count


<xsl:value-of select="position() + 1"/>

And my tr/ wasn't a type.  This is how I handle two columns.  I'm still
not exactly sure what you are trying to do, but the code above will
reference all BBB with even numbered prop values... mod 2 != 1
essentially.


-----Original Message-----
From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
[mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Karl J.
Stubsjoen
Sent: Thursday, February 05, 2004 11:59 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Apply Template based on position or count

I think there might also be a <tr/> typo.
But now let me ask, given the sample XML:

<AAA>
  <BBB prop="1"></BBB>
  <BBB prop="2"></BBB>
  <BBB prop="3"></BBB>
  <BBB prop="4"></BBB>
  <BBB prop="5"></BBB>
</AAA>

Within a for-each... if I have the following for each loop and if
construct,
and for sake of discussion we are currently at:
BBB prop 3:

  <xsl:for-each select="//BBB">
        <xsl:if test="position() mod 2 = 1">

                [[[ HOW TO IMPLICITLY REFERENCE "BBB prop 4" ]]]

        </xsl:if>
  </xsl:for-each>


This would clean up your suggestion (i think - if this works).

Karl



----- Original Message -----
From: "Kenny Akridge" <kakridge@xxxxxxxxxxxxx>
To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Thursday, February 05, 2004 8:21 PM
Subject: RE: [xsl] Apply Template based on position or count


> Sorry, missed a closing <if> there.
>
> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Kenny
> Akridge
> Sent: Thursday, February 05, 2004 10:03 PM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] Apply Template based on position or count
>
> I'm not exactly certain what you are trying to do, but if you want two
> columns, you'll need to do something like this:
>
>  <table width="200" border="1">
>   <xsl:for-each select="//z:row">
>         <xsl:if test="position() mod 2 = 1">
>      <tr/>
>          <td valign="top"><xsl:apply-templates select="."
> mode="session_info"/></td>
>             <td valign="top"><xsl:apply-templates select="."
> mode="session_info"/></td>
>         </xsl:if>
>         <xsl:if test="position() mod 2 = 0">
>
>          <td valign="top"><xsl:apply-templates select="."
> mode="session_info"/></td>
>             <td valign="top"><xsl:apply-templates select="."
> mode="session_info"/></td>
> <tr/>
>         </xsl:for-each>
>
>     </table>
>
> Notic:  the second select is "."  How do i get the next z:row?
>
> >>> The next z:row will be given to you in the for-each loop.
> >>> Maybe some sample xml and a simple drawing will help.
>
> Karl
>
>
> ----- Original Message -----
> From: "Karl J. Stubsjoen" <karl@xxxxxxxxxxxxx>
> To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
> Sent: Thursday, February 05, 2004 6:25 PM
> Subject: [xsl] Apply Template based on position or count
>
>
> > Hi there,
> >
> > I have a node fragment with (lets say) 20 items in it.  I would like
> to
> > apply a template rule which matches the first 10 nodes, and then
later
> the
> > 2nd ten.  Ultimately I am trying to create two columns in my html
> output.
> > Now, lets say there are 25 items, so the first set would contain 13
> items
> > and the 2nd set 12 items - but somehow in XSLT no that we need to
> match 13
> > rows on the left so add 1 more row.
> >
> > So, can you apply-templates and specify some sort of [1-10] match?
> >
> > Karl
> >
> >
> >
> >  XSL-List info and archive:
http://www.mulberrytech.com/xsl/xsl-list
> >
> >
>
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>
>


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread