Subject: RE: [xsl] remove relative path From: "Gav...." <brightoncomputers@xxxxxxxxxxxxxxxxxxx> Date: Wed, 17 May 2006 20:02:27 +0800 |
Thanks Jon, I have this working now, thanks for your pointers. Gav... > -----Original Message----- > From: Jon Gorman [mailto:jonathan.gorman@xxxxxxxxx] > Sent: Wednesday, 17 May 2006 8:30 AM > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: Re: [xsl] remove relative path > > On 5/16/06, Gav.... <brightoncomputers@xxxxxxxxxxxxxxxxxxx> wrote: > > Hi All, > > > > I have looked through the list, archives etc and come up some code based > on > > what I summized from it, but of course it does not work. > > > > For an OS project, I'm trying to remove all ../ from the supplied @src > path. > > Obviously they can be nested values too such as ../../../ > > > > So I need to remove all these leaving just the filename. (I can then > prepend > > A predetermined path onto it.) > > > > I have a template :- > > > > <xsl:template name="removedotdots"> > > <xsl:param name="path"/> > > <xsl:variable name="removedirs" > > select="substring-after(string($path),'../')"/> > > <xsl:variable name="removeagain" > > select="starts-with(string($removedirs),'../')"/> > > <xsl:if test="$removeagain"> > > <xsl:call-template name="removedotdots"> > > <xsl:with-param name="path" > > select="substring-after(string($removedirs),'../')"/> > > </xsl:call-template> > > </xsl:if> > > </xsl:template> > > But what if it's five levels? Fifteen? Why do this approach? > Recursion is your friend with XSLT. > > XSLT 2.0 has better ways, and probably so does XSLT 1.0. But right > off the top of my head even without thinking, I can come up with a > recursive way: > > Something like: > > > <xsl:template match="path"> > > <filename> > <xsl:call-template name="getFilename"> > <xsl:with-param name="path_string" select="." /> > </xsl:call-template> > > </filename> > </xsl:template> > > <xsl:template name="getFilename"> > <xsl:param name="path_string" /> > <xsl:choose> > <xsl:when test="starts-with($path_string,'../')"> > <xsl:call-template name="getFilename"> > <xsl:with-param name="path_string" > select="substring-after($path_string,'../')" /> > </xsl:call-template> > </xsl:when> > <xsl:when test="starts-with($path_string,'/../')"> > <xsl:call-template name="getFilename"> > <xsl:with-param name="path_string" > select="substring-after($path_string,'/../')" /> > </xsl:call-template> > </xsl:when> > <xsl:otherwise> > <xsl:value-of select="$path_string"/> > </xsl:otherwise> > </xsl:choose> > > </xsl:template> > > This assuming the path is an element in path, but it should be > straightforward enough to figure out. > > There's probably lots of other ways to do this. > > > Jon Gorman > > > > > -- > No virus found in this incoming message. > Checked by AVG Free Edition. > Version: 7.1.392 / Virus Database: 268.6.0/341 - Release Date: 16/05/2006
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] remove relative path, Jon Gorman | Thread | [xsl] XSLT with PHP, Kunsmann, Matthias |
RE: [xsl] Fixed value only once in , Michael Kay | Date | Re: [xsl] XSLT with PHP, Jon Gorman |
Month |