|
Subject: Re: [xsl] decoding hex string to ascii or UTF-8 From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> Date: Tue, 1 Jul 2008 08:15:57 -0700 |
One possible way:
<xsl:function name="f:hex-to-string" as="xs:string" >
<xsl:param name="pHex" as="xs:string"/>
<xsl:variable name="vHexDigits" as="xs:string"
select="'0123456789ABCDEF'"/>
<xsl:variable name="vHex" select="upper-case($pHex)"/>
<xsl:sequence select=
"if(string-length($pHex) mod 2 ne 0
or
string-length(translate($vHex,$vHexDigits,'')) ne 0
)
then error()
else
codepoints-to-string(
(for $i in (1 to string-length($vHex))[. mod 2 = 1],
$d1 in substring($vHex,$i,1),
$d2 in substring($vHex,$i+1,1)
return
16* string-length(substring-before($vHexDigits, $d1))
+
string-length(substring-before($vHexDigits, $d2))
)
)
"
/>
</xsl:function>
When we test this function in the following transformation:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f xs"
>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:value-of select="string-to-codepoints('Hello, World!')"/>
=================
<xsl:value-of select=
"codepoints-to-string((72,101,108,108,111,44,32,87,111,114,108,100,33))"/>
=================
<xsl:value-of select="f:hex-to-string('48656c6c6f2c20576f726c6421')"/>
</xsl:template>
<xsl:function name="f:hex-to-string" as="xs:string" >
<xsl:param name="pHex" as="xs:string"/>
<xsl:variable name="vHexDigits" as="xs:string"
select="'0123456789ABCDEF'"/>
<xsl:variable name="vHex" select="upper-case($pHex)"/>
<xsl:sequence select=
"if(string-length($pHex) mod 2 ne 0
or
string-length(translate($vHex,$vHexDigits,'')) ne 0
)
then error()
else
codepoints-to-string(
(for $i in (1 to string-length($vHex))[. mod 2 = 1],
$d1 in substring($vHex,$i,1),
$d2 in substring($vHex,$i+1,1)
return
16* string-length(substring-before($vHexDigits, $d1))
+
string-length(substring-before($vHexDigits, $d2))
)
)
"
/>
</xsl:function>
</xsl:stylesheet>
the wanted result is produced:
72 101 108 108 111 44 32 87 111 114 108 100 33
=================
Hello, World!
=================
Hello, World!
--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
On Tue, Jul 1, 2008 at 6:42 AM, Steven Hentschel
<steven.hentschel@xxxxxxxxxxx> wrote:
>
> I'm currently trying to work out the best way to convert a string of hex into the characters represented by each hex byte. I'm using xslt 2.0. So far I've come up with a function that simply does a lookup to from the hex value to the ascii character that hex value represents (see below). Can anyone suggest a better way? Is there a way (without using a huge lookup to achieve a similar sort of thing for UTF-8 chars?
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> !
> "
> #
> $
> %
> &
> '
> (
> )
> *
> +
> ,
> -
> .
> /
> 0
> 1
> etc.
>
>
> Regards
>
> Steven Hentschel
> _________________________________________________________________
>
> http://clk.atdmt.com/UKM/go/msnnkmgl0010000002ukm/direct/01/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] decoding hex string to as, G. Ken Holman | Thread | Re: [xsl] decoding hex string to as, Steven Hentschel |
| Re: [xsl] decoding hex string to as, G. Ken Holman | Date | Re: [xsl] Cocoon, Wendell Piez |
| Month |