Steffen Schindler
Steffen Schindler

Reputation: 795

Xslt for splitting a url in parts and combing them again

I want to build a sort of breadcrumb. I have link for example

http://server/site1/site2/site3

and want to build something like

<a href="http://server">http://server</a><a href="http://server/site1">http://server/site1</a>...

How can I do this with xslt?

Upvotes: 0

Views: 993

Answers (1)

JLRishe
JLRishe

Reputation: 101680

This can be accomplished with a recursive template:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:variable name="urlSample" select="'http://server/site1/site2/site3'" />

  <xsl:template match="/">
    <xsl:call-template name="UrlLinks">
      <xsl:with-param name="url" select="$urlSample" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="UrlLinks">
    <xsl:param name="url" />
    <xsl:call-template name="UrlLinksIter">
      <xsl:with-param name="portionSoFar" select="concat(substring-before($url, '://'), '://')" />
      <xsl:with-param name="remainder" select="concat(substring-after($url, '://'), '/')" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="UrlLinksIter">
    <xsl:param name="portionSoFar" />
    <xsl:param name="remainder" />

    <xsl:variable name="nextPart" select="substring-before($remainder, '/')" />
    <xsl:variable name="nextRemainder" select="substring-after($remainder, '/')" />
    <xsl:if test="normalize-space($nextRemainder) or normalize-space($nextPart)">
      <xsl:variable name="url" select="concat($portionSoFar, $nextPart)"/>
      <xsl:if test="normalize-space($nextPart)">
        <!-- $nextPart could be empty if there are multiple slashes in a row-->
        <a href="{$url}">
          <xsl:value-of select="$url"/>
        </a>
      </xsl:if>
      <xsl:call-template name="UrlLinksIter">
        <xsl:with-param name="portionSoFar" select="concat($url, '/')" />
        <xsl:with-param name="remainder" select="$nextRemainder" />
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

When this is run on any input (since the sample value is in a variable here) this produces:

<a href="http://server">http://server</a>
<a href="http://server/site1">http://server/site1</a>
<a href="http://server/site1/site2">http://server/site1/site2</a>
<a href="http://server/site1/site2/site3">http://server/site1/site2/site3</a>

Upvotes: 3

Related Questions