Subject: Re: [xsl] escaping/entities on the fly? From: Kevin Rodgers <kevin.rodgers@xxxxxxx> Date: Fri, 4 Mar 2005 16:37:13 -0700 |
Gabriel K. writes: > > 1. If you click on the link in the mail message, does your mail > > composition agent put "=?ISO-8859-1?Q?kabelskcccc=E5p?=" in the > > subject line? > > Yes it does. Are you saying this is correct, that it should be this way? > > > 2. If you change the address to your own and send it, is the message > > delivered with the subject intact? Has your mail user agent added > > the appropriate MIME headers: > > The message is delivered with the subject : "kabelskccccep". So this seems > to work. :) > > > MIME-Version: 1.0 > > Content-Type: text/plain > > Yes it has: > Content-Type: text/plain; > format=flowed; > charset="iso-8859-1"; > reply-type=original Good, so now we are back on topic (XSLT). > >> My link is created like this: > >> > >> <a> > >> <xsl:attribute name="href"> > >> mailto:<xsl:value-of select="$_settings/supportMail"/>?subject= > >> <xsl:value-of select="$_shared/serviceName"/>: <xsl:value-of > >> select="$_fullName"/> <xsl:value-of select="mir:KNP"/> > >> > >> </xsl:attribute> > >> <xsl:value-of select="$_shared/mailLink/responsible"/> > >> </a> > >> > >> the output of <xsl:value-of select="$_fullName"/> can be "kabelskep" for > >> instance. > >> So how do you suggest I modify the code? > > > What does the above XSLT generate? > > it generates this: > <a href="mailto:support@xxxxxxxxxx?subject= Mirakel Webbserver: > Kabelsk%C3%A5p KS0100"> Besides the non-ASCII character, the spaces need to be handled correctly (encoded as %20). > So my problem is that "e" is transformed to "%C3%A5" by the the XSL > processor and that does not display correctly in the mail client. > Instead it shows: "KabelskC%p", and the message source says: > "Kabelsk=C3=A5p". No. First you must encode the subject text per RFC 2047, then you must pass that through the XSLT escape-uri() function. The problem is that XSLT does not have built-in support for RFC-2047 encoding, so you will have to implement it. Here's my attempt to implement it, which cheats by using uri-escape() to convert each unsafe character and then translate() to convert each "%XX" to "=XX": <xsl:function name="rfc2047:qp-encode" xmlns:rfc2047="http://ietf.org/rfc/rfc2047.txt"> <xsl:param name="text"/> <xsl:value-of select="'=?UTF-8?Q?'"/> <xsl:for-each select="string-to-codepoints($text)"> <!-- Preserve printable ASCII chararacters, except for space (32) and question mark (63) ; escape ASCII control characters (0-31 and 127), and all non-ASCII characters (128-). --> <xsl:choose> <xsl:when test=". <= 32 or . = 63 or . >= 127"> <xsl:value-of select="translate(escape-uri(codepoints-to-string(.), true()), '%', '=')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="codepoints-to-string(.)"/> </xsl:otherwise> </xsl:choose> </xsl:for-each> <xsl:value-of select="'?='"/> </xsl:function> I hope the xsl-list readership will suggest improvements to that; in particular, it wouldn't work when I added as="xs:string" to the xsl:function declaration. Once rfc2047:qp-encode() is robust, the same boilerplate should be used to implement rfc2047:base64-encode(). Anyway, you should be able to do something like: <a href="concat('mailto:', $_settings/supportMail, '?subject=', escape-uri(rfc2047:qp-encode(concat($_shared/serviceName), ': ', $_fullName, ' ', mir:KNP), true())"> <xsl:value-of select="$_shared/mailLink/responsible"/> </a> -- Kevin Rodgers
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] escaping/entities on the , Gabriel K. | Thread | [xsl] Problem setting variable from, lotoole |
RE: [xsl] XML Root Element, Wendell Piez | Date | Re: [xsl] Using keys on a tree from, António Mota |
Month |