我编写了一段代码,在XSLT 2.0中将二进制转换为十进制,并且在结果中添加了每个数学幂值的值。请帮忙。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" extension-element-prefixes="xs">
<xsl:template match="SUBSCRIBER">
<xsl:variable name="binary" select="'0101'"/>
<xsl:for-each select="for $i in 1 to string-length($binary) return $i">
<xsl:variable name="powerVal">
<xsl:call-template name="mathpower">
<xsl:with-param name="base" select="2"/>
<xsl:with-param name="power" select="(string-length($binary)-.)"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="number(substring($binary,.,1))*number($powerVal)"/>
<xsl:value-of select="'--'"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="mathpower">
<xsl:param name="base" select="0"/>
<xsl:param name="power" select="1"/>
<xsl:param name="result" select="1"/>
<xsl:choose>
<xsl:when test="$power = 0">
<xsl:value-of select="$result"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="mathpower">
<xsl:with-param name="base" select="$base"/>
<xsl:with-param name="power" select="$power - 1"/>
<xsl:with-param name="result" select="$result * $base"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:4)
此任务不需要昂贵的电源功能。这是一个兼容XSLT 1.0的模板,递归地“吃掉”二进制字符串,乘以2并添加下一个二进制数字。
我在这里使用了一个模板,因为模板可以有默认参数,在这种情况下是从“外部”调用模板时不应提供的参数integer
。
<xsl:template name="bin2int">
<xsl:param name="binaryString"/>
<xsl:param name="integer" select="0"/>
<xsl:choose>
<xsl:when test="$binaryString=''">
<xsl:value-of select="$integer"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="bin2int">
<xsl:with-param name="binaryString" select="substring($binaryString,2)"/>
<xsl:with-param name="integer" select="2*$integer + number(substring($binaryString,1,1))"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 1 :(得分:1)
如果您使用的是XSLT 2.0,那么请考虑使用函数而不是模板,因为它们可以在表达式中调用。 power
已完成,搜索会找到http://users.atw.hu/xsltcookbook2/xsltckbk2-chp-3-sect-5.html
<!-- Power -->
<xsl:function name="ckbk:power" as="xs:double">
<xsl:param name="base" as="xs:double"/>
<xsl:param name="exp" as="xs:integer"/>
<xsl:sequence
select="if ($exp lt 0) then ckbk:power(1.0 div $base, -$exp)
else
if ($exp eq 0)
then 1e0
else $base * ckbk:power($base, $exp - 1)"/>
</xsl:function>