[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] problem with variable and position()


Subject: RE: [xsl] problem with variable and position()
From: fe.sola@xxxxxxxxxxxxxx
Date: Wed, 27 Aug 2003 17:42:56 -0400

Hello Jarno and Michael, thanks for your quick response.
I still have troubles with this template, I realized I can't use a variable on a match 
expression and it is a bad practice to use a global one, re-wrote the template but still 
no good.
The input xhtml documet has several text nodes, one of them starts with the 
word "Description", I should be able to select all the text nodes that have a position 
higher than that one and put it on a single description element.
The templates I rewrote are:
<xsl:template match="body">
     <!-- some templates here for the rest of the text nodes-->
     <xsl:element name="description">
                       <xsl:apply-templates select="text()[starts-with(normalize-space
(),'Description')]"/>
     </xsl:element>
</xsl:template>
<xsl:template match="text()[starts-with(normalize-space(),'Description')]">
                   <xsl:variable name="descPos" select="position()"/> 
                   <xsl:apply-templates select="text()[position()>$descPos]"/> 
</xsl:template>   and hoped the built in templates would work but the <description> tag 
won't get any value after the transformation...
tia, lizet

Mensaje citado por Jarno.Elovirta@xxxxxxxxx:

> Hi,
> 
> > <xsl:template match="body">
> >                     <xsl:element name="description">
> >                        <xsl:apply-templates 
> > select="text()[starts-with(normalize-space
> > (),'Description')]" mode="description"/>
> >                     </xsl:element>
> > </xsl:template>
> > <xsl:template 
> > match="text()[starts-with(normalize-space(),'Description')]" 
> > mode="description">
> >                          <xsl:variable name="descPos" 
> > select="position()"/>
> >                          <xsl:apply-templates 
> > select="text()[position()>$descPos]"/>
> >                                            
> > </xsl:template>
> 
> This template could as well be simply
> 
>   <xsl:template match="text()" mode="description">
>     <xsl:variable name="descPos" select="position()"/>
>     <xsl:apply-templates select="text()[position()>$descPos]"/>
>   </xsl:template>
> 
> unless you have multiple different templates that match text nodes in "description"
> mode.
> 
> > <xsl:template match="text()[position()>$descPos]">
> >                               <xsl:value-of select="."/>
> > </xsl:template>  
> 
> And this should be
> 
>   <xsl:template match="text()">
>     <xsl:value-of select="."/>
>   </xsl:template>
> 
> or, you don't even need this, because the build-in template rule will take care of it
>   
> > the input documents. I tried to store the position of the 
> > description text in the 
> > descPos variable to use it later, but the above stylesheet 
> > gives me an error of "Invalid 
> > variable reference". How could I re-write the last template 
> > so I avoid this error? 
> 
> For one, the descPos variable will be out of scope in the other template -- see the
> XSLT spec for variable scope. Also, variable references are not allowed in match
> patterns.
> 
> Cheers,
> 
> Jarno
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 




-------------------------------------------------
Este mensaje fue enviado usando el servicio de correo en web de Infomed
http://webmail.sld.cu

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



Current Thread
Keywords