我需要将十六进制值转换为整数值,我该如何使用XSLT做到这一点?
例如,如果输入是十六进制FF
,则输出应为255.
答案 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>