URL Encoding With XSL
From VYRE
Sometimes you will need to encode strings as URLs, for example when producing links for social bookmarking sites. This can be done using the following template in your XSL:
<!-- Template to Encode URLs --> <xsl:template name="url-encode"> <xsl:param name="str"/> <!-- Characters we'll support. We could add control chars 0-31 and 127-159, but we won't. --> <xsl:variable name="ascii"> !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~</xsl:variable> <xsl:variable name="latin1"> ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ</xsl:variable> <!-- Characters that usually don't need to be escaped --> <xsl:variable name="safe">!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~</xsl:variable> <xsl:variable name="hex" >0123456789ABCDEF</xsl:variable> <xsl:if test="$str"> <xsl:variable name="first-char" select="substring($str,1,1)"/> <xsl:choose> <xsl:when test="contains($safe,$first-char)"> <xsl:value-of select="$first-char"/> </xsl:when> <xsl:otherwise> <xsl:variable name="codepoint"> <xsl:choose> <xsl:when test="contains($ascii,$first-char)"> <xsl:value-of select="string-length(substring-before($ascii,$first-char)) + 32"/> </xsl:when> <xsl:when test="contains($latin1,$first-char)"> <xsl:value-of select="string-length(substring-before($latin1,$first-char)) + 160"/> </xsl:when> <xsl:otherwise> <xsl:message terminate="no">Warning: string contains a character that is out of range! Substituting "?".</xsl:message> <xsl:text>63</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="hex-digit1" select="substring($hex,floor($codepoint div 16) + 1,1)"/> <xsl:variable name="hex-digit2" select="substring($hex,$codepoint mod 16 + 1,1)"/> <xsl:value-of select="concat('%',$hex-digit1,$hex-digit2)"/> </xsl:otherwise> </xsl:choose> <xsl:if test="string-length($str) > 1"> <xsl:call-template name="url-encode"> <xsl:with-param name="str" select="substring($str,2)"/> </xsl:call-template> </xsl:if> </xsl:if> </xsl:template>
