|  | <?xml version="1.0" encoding="utf-8"?> | 
|  | <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> | 
|  |  | 
|  | <xsl:output method="xml" indent="yes" encoding="iso-8859-1"/> | 
|  |  | 
|  | <!-- ISO-8859-1 based URL-encoding demo | 
|  | Written by Mike J. Brown, mike@skew.org. | 
|  | Updated 2002-05-20. | 
|  |  | 
|  | No license; use freely, but credit me if reproducing in print. | 
|  |  | 
|  | Also see http://skew.org/xml/misc/URI-i18n/ for a discussion of | 
|  | non-ASCII characters in URIs. | 
|  | --> | 
|  |  | 
|  | <!-- The string to URL-encode. | 
|  | Note: By "iso-string" we mean a Unicode string where all | 
|  | the characters happen to fall in the ASCII and ISO-8859-1 | 
|  | ranges (32-126 and 160-255) --> | 
|  | <xsl:param name="iso-string" select="'¡Hola, César!'"/> | 
|  |  | 
|  | <!-- 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:template name="url-encode"> | 
|  | <xsl:param name="str"/> | 
|  | <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> | 
|  |  | 
|  | </xsl:stylesheet> | 
|  |  |