Subject: [xsl] Re: Returning a value from a template From: Narayan <ed_narayanan@xxxxxxxxx> Date: Wed, 10 Nov 2010 09:36:16 -0800 (PST) |
Date: Tue, 09 Nov 2010 21:50:43 -0500 To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx> Subject: Re: [xsl] Returning a value from a template Message-Id: <7.0.1.0.2.20101109211020.023bec20@xxxxxxxxxxxxxxxxxxxxxx> At 2010-11-09 18:07 -0800, Narayan wrote: >I have been scratching my head on how to return a value from a called template >which includes a for loop. A snippet of the XML fragment is as follows: > > <Loop-N1> > <Segment-N1> > <Element-98>BT</Element-98> > <Element-93 xsi:nil="true"/> > <Element-66>21</Element-66> > <Element-67>RA0129937</Element-67> > </Segment-N1> > </Loop-N1> > <Loop-N1> > <Segment-N1> > <Element-98>ST</Element-98> > <Element-93>ABC COLUMBUS DIVISION</Element-93> > <Element-66>11</Element-66> > <Element-67>RA0314562</Element-67> > </Segment-N1> > </Loop-N1> > >The element <Loop-N1> can occur multiple times. If one of the <Element-66>'s >contain a value of "21" then I need to generate a fixed string value >else I need >to generate another fixed string literal. So I tried creating a named template >and calling this from my main template like a function: > > <xsl:template name="getOrderSource"> > > <xsl:for-each select="/ns0:Transaction-850/ns0:Loop-N1"> > <xsl:if test='ns0:Segment-N1/ns0:Element-66 = "21"'> > <xsl:variable name="ordrSrc" select="NAEDI"/> > </xsl:if> > </xsl:for-each> > > <xsl:choose> > <xsl:when test='$orderSrc = "NAEDI"'> > <xsl:text disable-output-escaping="no">NAEDI</xsl:text> > </xsl:when> > <xsl:otherwise> > <xsl:text disable-output-escaping="no">NAEDIBrokerage</xsl:text> (the default for d-o-e is "no" so you don't have to say it) > </xsl:otherwise> > </xsl:choose> > </xsl:template> > >This was called like: > <corecom:ID> > <xsl:call-template name="getOrderSource"/> > </corecom:ID> > > >However, I realized that the variable declared inside the for-each is not >visible to the xsl:choose that follows. Right. The scope of a local variable is the following siblings and their descendants. There are no such following siblings. >What I was trying to do is to set a flag >to indicate that the element exists and then return the appropriate string >literal. Would there be a simpler way to do this? Yes ... don't use the flag. Something along the lines of: <xsl:template name="getOrderSource"> <xsl:for-each select="/ns0:Transaction-850/ns0:Loop-N1"> <xsl:choose> <xsl:when test='ns0:Segment-N1/ns0:Element-66 = "21"'>NAEDI</xsl:when> <xsl:otherwise>NAEDIBrokerage</xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> I hope this helps. . . . . . . . Ken -- Contact us for world-wide XML consulting & instructor-led training Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Legal business disclaimers: http://www.CraneSoftwrights.com/legal ------------------------------ Thanks Ken. The problem with the above approach is that if there are 3 Loop-N1's then the output would be: <corecom:ID>NAEDIBrokerageNAEDIBrokerageNAEDIBrokerage</corecom:ID> Thats why I was trying to set a flag inside the loop and then return a Single value.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] selecting a element witho, pankaj . c | Thread | Re: [xsl] Re: Returning a value fro, G. Ken Holman |
Re: [xsl] How to remove unnecessary, Abel Braaksma | Date | Re: [xsl] Re: Returning a value fro, G. Ken Holman |
Month |