Convert negative decimal to hexadecimal in xslt

折月煮酒 提交于 2019-12-11 12:40:58

问题


Please, can you help me how to convert negative/positive decimal value to hexadecimal in xslt/xslt 2.0 ?

This is what i tried but does not work with negative numbers/decimals,

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template name="ConvertDecToHex">
    <xsl:param name="index" />
    <xsl:if test="$index > 0">
      <xsl:call-template name="ConvertDecToHex">
        <xsl:with-param name="index" select="floor($index div 16)" />
      </xsl:call-template>
      <xsl:choose>
        <xsl:when test="$index mod 16 &lt; 10">
          <xsl:value-of select="$index mod 16" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:choose>
            <xsl:when test="$index mod 16 = 10">A</xsl:when>
            <xsl:when test="$index mod 16 = 11">B</xsl:when>
            <xsl:when test="$index mod 16 = 12">C</xsl:when>
            <xsl:when test="$index mod 16 = 13">D</xsl:when>
            <xsl:when test="$index mod 16 = 14">E</xsl:when>
            <xsl:when test="$index mod 16 = 15">F</xsl:when>
            <xsl:otherwise>A</xsl:otherwise>
          </xsl:choose>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

回答1:


This transformation:

<xsl:stylesheet version="2.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="my:my">
 <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:value-of select="my:intToHex(53), my:intToHex(-53)" separator="&#xA;"/>
  </xsl:template>

    <xsl:function name="my:intToHex" as="xs:string">
      <xsl:param name="pInt" as="xs:integer"/>

      <xsl:variable name="vMinusOneHex64" select="18446744073709551615"/>
      <xsl:variable name="vCompl" select=
        "if($pInt ge 0)
           then $pInt
           else $vMinusOneHex64 + $pInt +1"/>
      <xsl:sequence select=
      "if ($vCompl eq 0) 
          then '0' 
          else 
            concat(if ($vCompl gt 16)
                      then my:intToHex($vCompl idiv 16) 
                      else '',
                   substring('0123456789ABCDEF', 
                             ($vCompl mod 16) +1, 
                             1)
                   )"/>
    </xsl:function>
</xsl:stylesheet>

When applied on any source XML document (ignored), produces the desired result:

35
FFFFFFFFFFFFFFCB


来源:https://stackoverflow.com/questions/29280783/convert-negative-decimal-to-hexadecimal-in-xslt

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!