[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Overflow on building relative paths for one case only

Subject: Overflow on building relative paths for one case only
From: Cynthia.Arangua@xxxxxxxxxxxxxx
Date: Fri, 11 Jan 2008 14:51:52 -0600
 Overflow on building relative paths for one case only
Hi All-

I have the following XML which basically sets the groundwork for us to
build a simple relative href from where the XML object resides
(source_xml_path) to where the linked object resides in a directory
structure (source_document_path):

<?xml version="1.0" encoding="UTF-8"?>
<root>
<source_xml_path>/web_cabinet/folder1/folder2/folder3</source_xml_path>
<source_document_path>/web_cabinet/folder1/folder2/linkingToDocument.doc</source_document_path>

</root>

However, the only instance (that I have found so far) where this fails is
in the above XML.  Any other path specifications work fine and construct
the relative path.  Right now, I am just getting a stack overflow which I
am trying to nail down now.  Any suggestions on a resolution is greatly
appreciated.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:variable name="from" select="/root/source_xml_path"/>
 <xsl:variable name="to" select="/root/source_document_path"/>
 <xsl:template match="/root">
  <html>
   <head>
    <title>Getting relative paths</title>
   </head>
   <body>
    <xsl:value-of select="$from"/>
    <br/>
    <xsl:value-of select="$to"/>
    <br/>
    <xsl:call-template name="relativeUrl">
     <xsl:with-param name="from" select="$from"/>
     <xsl:with-param name="to" select="$to"/>
    </xsl:call-template>
   </body>
  </html>
 </xsl:template>
 <!--****************************************************************************-->

 <!--RELATIVE URL-->
 <!--****************************************************************************-->

 <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'">
    <xsl:variable name="strFrom">
     <xsl:call-template name="str">
      <xsl:with-param name="from" select="$from"/>
      <xsl:with-param name="to" select="$to"/>
     </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="dotdotSlash">
     <xsl:call-template name="dotSlash">
      <xsl:with-param name="convert" select="$strFrom"/>
     </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="url">
     <xsl:value-of select="$dotdotSlash"/>
     <xsl:value-of
     select="substring-after(substring-after($to,substring-before($from,$strFrom)),'/')"/>
    </xsl:variable>
    <xsl:value-of select="$url"/>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of
   select="substring-after(substring-after($to,$from),'/')"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="str">
  <xsl:param name="from"/>
  <xsl:param name="to"/>
  <xsl:choose>
   <xsl:when
    test="contains(substring-before(substring-after($from,'/'),'/'),substring-before(substring-after($to,'/'),'/'))
 and
    contains(substring-before(substring-after($to,'/'),'/'),substring-before(substring-after($from,'/'),'/'))">

    <xsl:call-template name="str">
     <xsl:with-param name="from" select="substring-after($from,'/')"/>
     <xsl:with-param name="to" select="substring-after($to,'/')"/>
    </xsl:call-template>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select="$from"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
 <xsl:template name="dotSlash">
  <xsl:param name="convert"/>
  <xsl:param name="result"/>
  <xsl:choose>
   <xsl:when test="substring-after($convert,'/')!=''">
    <xsl:variable name="newResult">
     <xsl:value-of select="$result"/>../</xsl:variable>
    <xsl:call-template name="dotSlash">
     <xsl:with-param name="convert"
     select="substring-after($convert,'/')"/>
     <xsl:with-param name="result" select="$newResult"/>
    </xsl:call-template>
   </xsl:when>
   <xsl:otherwise>
    <xsl:value-of select="$result"/>
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

Thank you all so much.
CA

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.