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