[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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Still not getting documen, Jon Gorman | Thread | [xsl] Keys and XML switching, tom tom |
RE: [xsl] Convert milliseconds into, xslt xslfo | Date | RE: [xsl] Determining the context n, Wendell Piez |
Month |