|
Subject: RE: [xsl] Overflow on building relative paths for one case only From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Sat, 12 Jan 2008 18:18:18 -0000 |
> It looks like your problem is associated with setting your
> variable $samePath to the boolean true() or false(), and then
> later on checking if $samePath equals the string 'false':
That doesn't look wrong to me. <xsl:value-of select="false()"/> will create
a text node whose string value is "false", just as if you wrote
<xsl:text>false</xsl:text>.
Moreover, <xsl:when test="not($samePath)"> is definitely wrong. $samePath is
a result tree fragment, and converting a result tree fragment to a boolean
should always give true.
Looking at the logic, why not make $samePath a boolean variable? This is
possible even in XSLT 1.0:
<xsl:variable name="samePath" select="$to=$from and
not(contains(substring-after(substring-after($to,$from),'/'),'/'))"/>.
Replaces 20 lines of code by one, and if you can do that a few times then
more of us might be inclined to look at the code and help you with it.
In fact that immediately seems to show a flaw: if $to=$from and both are
strings, then substring-after($to, $from) is "", and substring-after("",
"/") is "", and contains("", "/") is false, so the condition reduces further
to:
<xsl:variable name="samePath" select="$to=$from"/>
Michael Kay
http://www.saxonica.com/
>
> > <xsl:template name="relativeUrl">
> > <xsl:param name="from"/>
> > <xsl:param name="to"/>
> > <xsl:variable name="samePath">
> > <xsl:choose>
> > <!--<xsl:when test="starts-with($to,$from)">-->
> > <xsl:when test="$to=$from">
> > <xsl:choose>
> > <xsl:when
> >
> test="contains(substring-after(substring-after($to,$from),'/'),'/')">
> > <xsl:value-of select="false()"/>
> ^^^^^^^^^
> > </xsl:when>
> > <xsl:otherwise>
> > <xsl:value-of select="true()"/>
> ^^^^^^^^
> > </xsl:otherwise>
> > </xsl:choose>
> > </xsl:when>
> > <xsl:otherwise>
> > <xsl:value-of select="false()"/>
> ^^^^^^^^^
> > </xsl:otherwise>
> > </xsl:choose>
> > </xsl:variable>
> > <xsl:choose>
> > <xsl:when test="$samePath='false'">
> ^^^^^^^^^^^^^^^^^^^
> If you change that last xsl:when to:
>
> > <xsl:when test="not($samePath)">
>
> uou should be all set. For the example you provided, I get:
>
> <html>
> <head>
> <meta http-equiv="Content-Type" content="text/html;
> charset=utf-8">
>
> <title>Getting relative paths</title>
> </head>
>
> <body>/web_cabinet/folder1/folder2/folder3<br>/web_cabinet/fol
> der1/folder2/linkingToDocument.doc<br></body>
> </html>
>
> Cheers,
>
> ...sam
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Overflow on building rela, Sam Byland | Thread | Re: [xsl] Overflow on building rela, Sam Byland |
| Re: [xsl] Overflow on building rela, Sam Byland | Date | Re: [xsl] Overflow on building rela, Sam Byland |
| Month |