xsl-list
[Top] [All Lists]

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

2008-07-01 08:16:33
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(_dot_)hentschel(_at_)hotmail(_dot_)com> 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/
--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>