| <?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> | |