RE: [xsl] xsl:call-template problem

Subject: RE: [xsl] xsl:call-template problem
From: cknell@xxxxxxxxxx
Date: Tue, 22 Aug 2006 16:58:59 -0400
If I understand your requirement, you wish to process each <stream_definition> with two different templates.

The usual way to do this is by using a "mode" attribute on the templates and in the <apply-template> opening tag.

So here you want two templates:

<xsl:template match="stream_definition" mode="alpha">
  ... Your stuff goes here ...
</xsl:template>

<xsl:template match="stream_definition" mode="beta">
  ... Your other stuff goes here ...
</xsl:template>

Then you do either:

<xsl:apply-templates select="stream_definition" mode="alpha" />
<xsl:apply-templates select="stream_definition" mode="beta" />

Of course, what value you assign to the various "mode" attributes is up to you. I used "alpha" and "beta", you may want to use "cat" and "dog", or any other XML-legal values.



-- 
Charles Knell
cknell@xxxxxxxxxx - email



-----Original Message-----
From:     Lin, Jessica <jlin@xxxxxxxxxxx>
Sent:     Tue, 22 Aug 2006 11:55:58 -0700
To:       <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Subject:  [xsl] xsl:call-template problem


Here is the block of xml file. I want to repeat stream twice in
stream_loop and change the SCID to PID with differenct start number by
using xsl:call-template.

  <stream_loop>
    <stream_definition>
      <stream_type>2</stream_type>

      <SCID>100</SCID>
      <descriptors_loop_length>compute</descriptors_loop_length>
      <descriptor_loop>
        <about_descriptor>some description</about_descriptor>
        <additional_descriptor>other description</additional_descriptor>
      </descriptor_loop>
    </stream_definition>
  </stream_loop>


Here is the expected result:
 <stream_loop>
    <stream>
      <stream_type>2</stream_type>

      <PID>4112</SCID>
      <ECM>4113</ECM>
      <descriptors_loop_length>compute</descriptors_loop_length>
      <descriptor_loop>
        <about_descriptor>some description</about_descriptor>
        <additional_descriptor>other description</additional_descriptor>
      </descriptor_loop>
    </stream>
    <stream>
      <stream_type>2</stream_type>

      <PID>4114</SCID>
      <ECM>4115</ECM>
      <descriptors_loop_length>compute</descriptors_loop_length>
      <descriptor_loop>
        <about_descriptor>some description</about_descriptor>
        <additional_descriptor>other description</additional_descriptor>
      </descriptor_loop>
    </stream>
  </stream_loop>



Here is my xslt block:


<xsl:template name="repeat twice">		
  <xsl:param name="base" select="4112"/>
  <xsl:param name="start" select="0"/>
  <xsl:choose>
    <xsl:when test="$start < 2">
      <stream>
	<xsl:for-each select="node()">
	  <xsl:choose>
	    <xsl:when test="local-name(.)='SCID'">
	      <PID>
<xsl:value-of select="$base"/>
	      </PID>
              <ECM>
                <xsl:value-of select="$base+1"/>
	      </ECM>					
	    </xsl:when>
	    <xsl:otherwise>
	      <xsl:copy-of select="."/>
	    </xsl:otherwise>
	  </xsl:choose>
	</xsl:for-each>
      </stream>								
      <xsl:call-template name="calculate">

	<xsl:with-param name="base" select="$base+$start*2" />
	<xsl:with-param name="start" select="$start+1"/>
      </xsl:call-template>	
    </xsl:when>	
  </xsl:choose>
</xsl:template>


But the real result is not as what I am expecting. Can anyone tell me
what's wrong in my xslt block? Thank a lot.


--- Jessica

Current Thread