[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Unable to pass a param variable to a template inside a for-each loop


Subject: RE: [xsl] Unable to pass a param variable to a template inside a for-each loop
From: Rick.Jones@xxxxxxxxxxxxxx
Date: Thu, 13 Apr 2006 16:25:03 +0100

Hi,
Thank you as that does make the loopCtr param get set, but I maybe did not 
explain myself correctly as I only a 4 is returned from the example XML.

As the for loop goes over the number of <File> elements I require it to 
kind of pull the counter for the loop into the param. This is what I 
understood the position() command did in relation to the context node.

So, for example as there are four <File> elements in the document it will 
set the param with 1 on the first go and 2 on the second. I require the 
transform to end up with the same document again but with different 
<PickPosition> element results in each document output depending on the 
number of <File> elements that are traversed by the for-each loop like so:

<PickPosition>1</PickPosition>
<PickPosition>2</PickPosition>
<PickPosition>3</PickPosition>
<PickPosition>4</PickPosition>

Where each of the above has been inserted just the once into each document 
replication if there were four, as there are in the example XML.


Regards Rick






"Michael Kay" <mike@xxxxxxxxxxxx>
13/04/2006 15:43
Please respond to xsl-list

 
        To:     <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
        cc: 
        Subject:        RE: [xsl] Unable to pass a param variable to a template inside a for-each 
loop


You are applying templates to "/", the root node. You don't have a 
template
that matches "/" in the relevant mode, so the built-in template gets
invoked. The built in template does apply-templates on its children (in 
the
same mode), so at this stage your template

<xsl:template match="FileService" mode="ReaperMode">

gets invoked. But (in XSLT 1.0) the built-in template doesn't pass its
parameters on.

Change apply-templates select="/" to select="/FileService" and all should 
be
well. 

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

> -----Original Message-----
> From: Rick.Jones@xxxxxxxxxxxxxx [mailto:Rick.Jones@xxxxxxxxxxxxxx] 
> Sent: 13 April 2006 15:33
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Unable to pass a param variable to a template 
> inside a for-each loop
> 
> 
> 
> Hi,
> Problem:
> I am it seems unable to pass a param variable to a template 
> inside a for 
> each loop.
> 
> Objective:
> I am trying to get the param to capture the position number 
> of the node 
> that is being processed in the for loop.
> So, each time it goes around the position() is being captured 
> and inserted 
> into the output XML as a new node.
> 
> XSL Processor: Xalan 2.7
> XSL Language: 1.0
> 
> 
> Here is my XML input:
> <?xml version="1.0" encoding="UTF-8"?>
> <FileService>
>     <Route>Reaper</Route>
>     <File>
>         <Filename>C:\datatrans\trans\outbound\texty1.txt</Filename>
>         <ArchivePath>C:\datatrans\archive\outbound\</ArchivePath>
>         <LogPath>C:\datatrans\confirmations\outbound\</LogPath>
>     </File>
>     <File>
>         <Filename>C:\datatrans\trans\outbound\Texty2.txt</Filename>
>         <ArchivePath>C:\datatrans\archive\outbound\</ArchivePath>
>         <LogPath>C:\datatrans\confirmations\outbound\</LogPath>
>     </File>
>     <File>
>         <Filename>C:\datatrans\trans\outbound\Word Doco.doc</Filename>
>         <ArchivePath>C:\datatrans\archive\outbound\</ArchivePath>
>         <LogPath>C:\datatrans\confirmations\outbound\</LogPath>
>     </File>
>     <File>
>         <Filename>C:\datatrans\trans\outbound\Word.doc</Filename>
>         <ArchivePath>C:\datatrans\archive\outbound\</ArchivePath>
>         <LogPath>C:\datatrans\confirmations\outbound\</LogPath>
>     </File>
>     <Routing>SSI-F</Routing>
>     <TransferProtocol>
>         <Protocol>FTP</Protocol>
>         <IP>127.0.0.1</IP>
>         <Port>21</Port>
>         <LoginName>username</LoginName>
>         <Password>userpassword</Password>
>     </TransferProtocol>
>     <TransferQueue>
>         <QueueName>Outbound</QueueName>
>         <TransferJob>XferOut</TransferJob>
>     </TransferQueue>
> </FileService>
> 
> 
> I have a style sheet (edited for this post) like so:
> 
> 
>        <xsl:when test="FileService/Route='Reaper'">
>                <xsl:for-each select="FileService/File">
>                        <xsl:apply-templates select="/" mode="ReaperMode">
>                                <xsl:with-param name="loopCtr" 
select="position()"/>
>                        </xsl:apply-templates>
>                </xsl:for-each>
>        </xsl:when>
>
> <!-- Match the the whole of the document for invoking the 
> FileReaper --> 
>         <xsl:template match="FileService" mode="ReaperMode">
>                 <xsl:param name="loopCtr"/>
>       <!-- Java Service that is called -->
>                 <jbi:invoke service="foo:FileReaper">
>                         <jbi:copyProperties/>
> 
>                         <!-- the message sent to will be the 
> result of 
> this next call -->
>                         <xsl:apply-templates select="." 
> mode="PickPosition">
>                                 <xsl:with-param name="posCtr2" 
> select="$loopCtr"/>
>                         </xsl:apply-templates>
> 
>                 </jbi:invoke>
>         </xsl:template>
> 
>         <!-- Rebuild the document by the template adding the 
> Pick Position 
> -->
>         <xsl:template match="FileService" mode="PickPosition">
>                 <xsl:param name="posCtr2"/>
>                 <FileService>
>                         <xsl:copy-of select="Route"/>
>                         <xsl:copy-of select="Position"/>
> 
>                         <!-- New node with param -->
>                         <PickPosition><xsl:value-of 
> select="$posCtr"/></PickPosition>
> 
>                         <xsl:copy-of select="File"/>
>                         <xsl:copy-of select="Routing"/>
>                         <xsl:copy-of select="TransferProtocol"/>
>                         <xsl:copy-of select="TransferQueue"/>
>                 </FileService>
>         </xsl:template>
> 
> 
> The XML is being passed to the JAVA service for each File 
> element (which 
> means multiple times which is what I require) however the 
> <PickPosition> 
> element has no value on the output.
> 
> If I force the line <xsl:param name="loopCtr"/> to read <xsl:param 
> name="loopCtr select"12345"/> then I do get a 12345 output 
> for the param 
> and element.
> 
> However I get nothing passed to the template with the for 
> each line of 
> <xsl:with-param name="loopCtr" select="position()"/>.
> Even if I force that with a dummy value like so <xsl:with-param 
> name="loopCtr" select="99999"/> I still get no value! It 
> seems unable to 
> set and pass the loopCtr value to the ReaperMode template. 
> All the rest 
> seems to work.
> 
> I must be missing something but as I understood it this is 
> the way params 
> worked :(
> 
> 
> Regards Rick
> 
> Direct Line Group Limited, registered in England 
> with number 2811437, registered office 3 Edridge 
> Road, Croydon, Surrey  CR9 1AG.  The following 
> companies are members of the Direct Line Group: 
> Direct Line Insurance plc, Direct Line Life 
> Insurance Company Limited, Direct Line Unit 
> Trusts Limited and Direct Line Financial 
> Services Limited, all of which are authorised 
> and regulated by the Financial Services Authority.
> All are members of The Royal Bank of Scotland Group.
> 
> This email is intended for the addressee only and 
> may contain confidential, proprietary or legally 
> privileged information.  If you are not the 
> intended recipient of this email you should 
> notify us immediately and delete it.  You should 
> not copy, print, distribute, disclose or use any 
> part of it.  We reserve the right to monitor and 
> record all electronic communications through our 
> networks.  We cannot accept any liability for 
> viruses transmitted via this email once it has 
> left our network.





Direct Line Group Limited, registered in England 
with number 2811437, registered office 3 Edridge 
Road, Croydon, Surrey  CR9 1AG.  The following 
companies are members of the Direct Line Group: 
Direct Line Insurance plc, Direct Line Life 
Insurance Company Limited, Direct Line Unit 
Trusts Limited and Direct Line Financial Services 
Limited, all of which are authorised and regulated 
by the Financial Services Authority.  All are 
members of The Royal Bank of Scotland Group.

This email is intended for the addressee only and 
may contain confidential, proprietary or legally 
privileged information.  If you are not the 
intended recipient of this email you should 
notify us immediately and delete it.  You should 
not copy, print, distribute, disclose or use any 
part of it.  We reserve the right to monitor and 
record all electronic communications through our 
networks.  We cannot accept any liability for 
viruses transmitted via this e-mail once it has 
left our networks.


Current Thread
Keywords