在XSLT中将十六进制数转换为整数

时间:2014-04-07 06:34:30

标签: xslt

我需要将十六进制值转换为整数值,我该如何使用XSLT做到这一点?

例如,如果输入是十六进制FF,则输出应为255.

2 个答案:

答案 0 :(得分:9)

编辑抱歉,我的不好我刚刚注意到OP要求十六进制到小数而不是相反。

XSLT-1.0

的hexToDecimal模板
<xsl:template name="hexToDecimal">
    <xsl:param name="hex"/>
    <xsl:variable name="dec"
        select="string-length(substring-before('0123456789ABCDEF', substring($hex,1,1)))"/>
    <xsl:choose>
        <xsl:when test="$hex = ''">0</xsl:when>
        <xsl:otherwise>
            <xsl:variable name="rest">
                <xsl:call-template name="hexToDecimal">
                    <xsl:with-param name="hex">
                        <xsl:value-of select="substring($hex,2)"/>
                    </xsl:with-param>
                </xsl:call-template>
            </xsl:variable>
            <xsl:value-of select="$dec * math:power(16, string-length($hex) - 1) + $rest"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

这需要来自exslt http://exslt.org/math/

math:power

XSLT-2.0

的hexToDecimal函数
<xsl:function name="f:hexToDec">
    <xsl:param name="hex"/>
    <xsl:variable name="dec"
        select="string-length(substring-before('0123456789ABCDEF', substring($hex,1,1)))"/>
    <xsl:choose>
        <xsl:when test="matches($hex, '([0-9]*|[A-F]*)')">
            <xsl:value-of
        select="if ($hex = '') then 0
        else $dec * f:power(16, string-length($hex) - 1) + f:hexToDec(substring($hex,2))"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:message>Provided value is not hexadecimal...</xsl:message>
            <xsl:value-of select="$hex"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:function>

<xsl:function name="f:power">
    <xsl:param name="base"/>
    <xsl:param name="exp"/>
    <xsl:sequence
        select="if ($exp lt 0) then f:power(1.0 div $base, -$exp)
                else if ($exp eq 0)
                then 1e0
                else $base * f:power($base, $exp - 1)"
    />
</xsl:function>

离开这里,也没有被要求,它可能仍然有用。

xslt中没有直接实现的功能,所以你必须自己编写它。

这是 XSLT 1.0

的模板
<xsl:template name="decimalToHex">
    <xsl:param name="dec"/>
    <xsl:if test="$dec > 0">
        <xsl:call-template name="decimalToHex">
            <xsl:with-param name="dec" select="floor($dec div 16)"/>
        </xsl:call-template>
        <xsl:value-of select="substring('0123456789ABCDEF', (($dec mod 16) + 1), 1)"/>
    </xsl:if>
</xsl:template>

你这样称呼它:

<xsl:call-template name="decimalToHex">
    <xsl:with-param name="dec">4095</xsl:with-param>
</xsl:call-template>

XSLT 2.0 的功能:

<xsl:function name="f:decimalToHex">
    <xsl:param name="dec"/>
    <xsl:if test="$dec > 0">
        <xsl:value-of
            select="f:decimalToHex(floor($dec div 16)),substring('0123456789ABCDEF', (($dec mod 16) + 1), 1)"
            separator=""
        />
    </xsl:if>
</xsl:function>

你可以这样打电话:

<xsl:value-of select="f:decimalToHex(4095)"/>

请注意,您必须在样式表中声明函数的命名空间。

答案 1 :(得分:9)

在纯XSLT 1.0中将十六进制转换为十进制:

<xsl:template name="hex2num">
    <xsl:param name="hex"/>
    <xsl:param name="num" select="0"/>
    <xsl:param name="MSB" select="translate(substring($hex, 1, 1), 'abcdef', 'ABCDEF')"/>
    <xsl:param name="value" select="string-length(substring-before('0123456789ABCDEF', $MSB))"/>
    <xsl:param name="result" select="16 * $num + $value"/>
    <xsl:choose>
        <xsl:when test="string-length($hex) > 1">
            <xsl:call-template name="hex2num">
                <xsl:with-param name="hex" select="substring($hex, 2)"/>
                <xsl:with-param name="num" select="$result"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$result"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>