url-encode
str
<?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 match="/"> <result> <string> <xsl:value-of select="$iso-string"/> </string> <hex> <xsl:call-template name="url-encode"> <xsl:with-param name="str" select="$iso-string"/> </xsl:call-template> </hex> </result> </xsl:template> <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>
ScrewTurn Wiki version 3.0.1.400. Some of the icons created by FamFamFam. Except where noted, all contents Copyright © 1999-2024, Patrick Jasinski.