前几天写个样式文件,有个需要将16进制转成10进制,使用模板实现该功能:
转换函数:
<xsl:template name="HEXTONUM">
<xsl:param name="str"/>
<xsl:param name="sum"/>
<xsl:param name="pos"/>
<xsl:variable name="dec">
<xsl:call-template name="HextoDec">
<xsl:with-param name="hexnum" select= "substring($str,number($pos),1)"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$pos > string-length($str)">
<xsl:value-of select="$sum"/>
</xsl:if>
<xsl:if test="$pos <= string-length($str)">
<xsl:call-template name="HEXTONUM">
<xsl:with-param name="str"><xsl:value-of select="$str"/> </xsl:with-param>
<xsl:with-param name="sum"><xsl:value-of select="number($sum)*16+$dec"/></xsl:with-param>
<xsl:with-param name="pos"><xsl:value-of select="number($pos)+1"/></xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="HextoDec">
<xsl:param name="hexnum"/>
<xsl:choose>
<xsl:when test="$hexnum='0'">
<xsl:value-of select="0"/>
</xsl:when>
<xsl:when test="$hexnum='1'">
<xsl:value-of select="1"/>
</xsl:when>
<xsl:when test="$hexnum='2'">
<xsl:value-of select="2"/>
</xsl:when>
<xsl:when test="$hexnum='3'">
<xsl:value-of select="3"/>
</xsl:when>
<xsl:when test="$hexnum='4'">
<xsl:value-of select="4"/>
</xsl:when>
<xsl:when test="$hexnum='5'">
<xsl:value-of select="5"/>
</xsl:when>
<xsl:when test="$hexnum='6'">
<xsl:value-of select="6"/>
</xsl:when>
<xsl:when test="$hexnum='7'">
<xsl:value-of select="7"/>
</xsl:when>
<xsl:when test="$hexnum='8'">
<xsl:value-of select="8"/>
</xsl:when>
<xsl:when test="$hexnum='9'">
<xsl:value-of select="9"/>
</xsl:when>
<xsl:when test="$hexnum='A' or $hexnum='a'">
<xsl:value-of select="10"/>
</xsl:when>
<xsl:when test="$hexnum='B' or $hexnum='b'">
<xsl:value-of select="11"/>
</xsl:when>
<xsl:when test="$hexnum='C' or $hexnum='c'">
<xsl:value-of select="12"/>
</xsl:when>
<xsl:when test="$hexnum='D' or $hexnum='d'">
<xsl:value-of select="13"/>
</xsl:when>
<xsl:when test="$hexnum='E' or $hexnum='e'">
<xsl:value-of select="14"/>
</xsl:when>
<xsl:when test="$hexnum='F' or $hexnum='f'">
<xsl:value-of select="15"/>
</xsl:when>
</xsl:choose>
</xsl:template>
调用方法:
<xsl:call-template name="HEXTONUM">
<xsl:with-param name="str">FFFF</xsl:with-param>
<xsl:with-param name="sum">0</xsl:with-param>
<xsl:with-param name="pos">1</xsl:with-param>
</xsl:call-template>
举一反三,通过这种方式可以在XSL中实现一些较为复杂的转换逻辑,实现该功能可能有其他更好的方法,欢迎大家提出改进意见。