Re: [xsl] decoding hex string to ascii or UTF-8

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?
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>        !
>        "
>        #
>        $
>        %
>        &
>        &apos;
>        (
>        )
>        *
>        +
>        ,
>        -
>        .
>        /
>        0
>        1
> etc.
>
>
> Regards
>
> Steven Hentschel
> _________________________________________________________________
>
> http://clk.atdmt.com/UKM/go/msnnkmgl0010000002ukm/direct/01/

Current Thread