Subject: RE: [xsl] Return value from a template 2... From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 23 Jan 2008 09:14:53 -0000 |
> <xsl:template match="/root"> > <xsl:variable name="idList"> > <xsl:call-template select="/root/vid" > name="getIdList" /> > </xsl:variable> > <xsl:value-of select="$idList"/> > </xsl:template> I'm amazed when you say you "get nothing". What processor are you using? You should get a string of compiler error messages. The first one should say that xsl:call-template cannot have a select attribute. If you want to pass a parameter with call-template, use xsl:with-param. > > <xsl:template match="/root/vid" name="getIdList"> It's not actually an error to have both a "match" and a "name" on a template: it means you can invoke it using either call-template or apply-templates. But it can be a bit misleading - when invoked using apply-templates, the name is ignored, and when invoked using call-template, the match is ignored. > <xsl:for-each select="."> I don't know what you thought xsl:for-each select="." would do, but it's a no-op. It iterates over the node-set that contains a single node, the context node, and makes each node in that node-set the context node in turn. In other words, it does nothing. > <xsl:variable name="var" > select="concat($var,ids, $delimiter)"/> This is where you should get your second error. The variable $var referenced in the select expression has not been declared. You can't refer to a variable within its own declaration. > </xsl:for-each> > <xsl:value-of select="$var"/> And here is your third syntax error; the variable $var that you declared earlier went out of scope when the for-each ended. (When I said the for-each had no effect, I lied. It has the effect of making your variable inaccessible.) > </xsl:template> > > </xsl:stylesheet> > > What's wrong in it? is there another simple way to get what i want? > You haven't shown your input structure so I'm reduced to guessing. With XSLT 2.0, I would think the answer is: <xsl:template match="/"> <xsl:variable name="idList" select="string-join(/root/vid/id, ',')"/> ... With 1.0, that becomes <xsl:variable name="idList"> <xsl:for-each select="/root/vid/id"> <xsl:value-of select="."/> <xsl:if test="position()!=last()">,</xsl:if> </xsl:for-each> </xsl:variable> You can add a call-template if you want, but it doesn't add much value. Michael Kay http://www.saxonica.com/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Return value from a templ, Ruud Grosmann | Thread | Re: [xsl] Return value from a templ, David Carlisle |
[xsl] RE: xsl-list Digest 23 Jan 20, Laura Porter | Date | Re: [xsl] Return value from a templ, David Carlisle |
Month |