Re: [xsl] Returning a value from a template

Subject: Re: [xsl] Returning a value from a template
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Wed, 10 Nov 2010 09:00:08 +0000
Well, if you really must use this kind of approach, a minimal change would be


<xsl:variable name="contains21"> <xsl:for-each select="/ns0:Transaction-850/ns0:Loop-N1"> <xsl:if test='ns0:Segment-N1/ns0:Element-66 = "21"'>*</xsl:if> </xsl:for-each> </xsl:variable>

and then test="$contains21 != ''"

Much simpler, though, is to replace your test='$orderSrc = "NAEDI"' with

test="/ns0:Transaction-850/ns0:Loop-N1/ns0:Segment-N1/ns0:Element-66 = '21'"



Michael Kay
Saxonica





On 10/11/2010 02:07, 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>
       </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. 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? Thanks!

Current Thread