14. Manipulating URIs in href attributes

xsl:stylesheet id="stylesheet" exclude-result-prefixes="x2 lit uri" version="1.0" xml:lang="en"

xsl:param name="uri" select="'file://localdir/'"

xsl:template name="absolute-uri" id="absolute-uri"
  xsl:param name="href" select="@href"
  xsl:param name="base"
  xsl:call-template name="uri:resolve-uri"
    xsl:with-param name="reference" select="$href"
    xsl:with-param name="base"
      xsl:choose
        xsl:when test="$base != ''"
          xsl:value-of select="$base"
        
        xsl:otherwise
          xsl:value-of select="$uri"
        
      
    
  


xsl:template name="id" id="id"
  xsl:param name="target" select="."
  xsl:param name="suffix" select="''"
  xsl:choose
    xsl:when test="$target/@id"
      xsl:value-of select="concat($target/@id, $suffix)"
    
    xsl:otherwise
      xsl:value-of select="concat(generate-id($target), $suffix)"
    
  


xsl:template name="map-uri"
  xsl:param name="href" select="@href"
  xsl:choose
    xsl:when test="starts-with($href, '#')"
      xsl:value-of select="$href"
    

    xsl:when test="contains($href, '#') and count($site-map-doc)>0"
      xsl:variable name="absolute-uri"
        xsl:call-template name="absolute-uri"
          xsl:with-param name="href" select="substring-before($href, '#')"
        
      
      xsl:for-each select="$site-map-doc"
        xsl:choose
          xsl:when test="count(key('html-uris', $absolute-uri))>0"
            xsl:call-template name="uri:make-relative"
              xsl:with-param name="reference" select="key('html-uris', $absolute-uri)[last()]/@to"
              xsl:with-param name="base" select="$uri"
            
          
          xsl:otherwise
            xsl:call-template name="uri:make-relative"
              xsl:with-param name="reference" select="$absolute-uri"
              xsl:with-param name="base" select="$uri"
            
          
        
        xsl:text#
        xsl:value-of select="substring-after($href, '#')"
      
    

    xsl:when test="count($site-map-doc)>0"
      xsl:variable name="absolute-uri"
        xsl:call-template name="absolute-uri"
          xsl:with-param name="href" select="$href"
        
      
      xsl:for-each select="$site-map-doc"
        xsl:choose
          xsl:when test="count(key('html-uris', $absolute-uri))>0"
            xsl:call-template name="uri:make-relative"
              xsl:with-param name="reference" select="key('html-uris', $absolute-uri)[last()]/@to"
              xsl:with-param name="base" select="$uri"
            
          
          xsl:otherwise
            xsl:call-template name="uri:make-relative"
              xsl:with-param name="reference" select="$absolute-uri"
              xsl:with-param name="base" select="$uri"
            
          
        
      
    
  


xsl:template name="html-uri"
  xsl:param name="href" select="@href"
  xsl:param name="suffix" select="'.xml'"
  xsl:param name="replacement" select="'.html'"

  xsl:choose
    xsl:when test="starts-with($href, '#')"
      xsl:value-of select="$href"
    

    xsl:when test="contains($href, '#') and contains($href, $suffix)"
      xsl:variable name="fragment" select="substring-after($href, '#')"
      xsl:variable name="doc-uri" select="substring-before($href, '#')"

      xsl:value-of select="concat(substring-before($doc-uri, $suffix), $replacement, '#', $fragment)"
    
    xsl:when test="contains($href, $suffix)"
      xsl:value-of select="concat(substring-before($href, $suffix), $replacement)"
    
    xsl:otherwise
      xsl:value-of select="$href"