如何在XSLT 1.0中计算带小数指数的数字的幂?

时间:2014-08-29 06:49:51

标签: xml xslt xslt-1.0

我正在寻找一种解决方案来计算XSLT 1.0中带小数指数的数字的幂。目前我使用的计算方法仅计算非小数指数的功率。这是我目前使用的模板:

<xsl:call-template name="Pow">
    <xsl:with-param name="Base" select="10"/>
    <xsl:with-param name="Exponent" select="2"/>
    <xsl:with-param name="Result" select="1"/>
</xsl:call-template>
<xsl:template name="Pow">                   <!-- TODO: Handle decimal exponents -->
    <xsl:param name="Base"/>
    <xsl:param name="Exponent"/>
    <xsl:param name="Result"/>
    <xsl:choose>
      <xsl:when test="$Exponent = 0">
        <xsl:value-of select="1"/>
      </xsl:when>
      <xsl:when test="$Exponent = 1">
        <xsl:value-of select="$Result * $Base"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="Pow">
          <xsl:with-param name="Base" select="$Base"/>
          <xsl:with-param name="Exponent" select="$Exponent - 1"/>
          <xsl:with-param name="Result" select="$Result * $Base"/>
        </xsl:call-template>                          
      </xsl:otherwise>
    </xsl:choose>
</xsl:template>

我不一定需要一个通用的解决方案。我只需要找到一个提升到幂2.4的数字的值。

我试图按如下方式解决我的问题:

x ^ (2.4) = (x ^ 2) * (x ^ 0.4)
= (x ^ 2) * (x ^ (2/5))
= (x ^ 2) * ((x ^ 2) ^ 1/5)

找到x的平方可以完成,所以我的问题分解为计算数字的“第5根”。

我还想过将我的问题分解为对数方程,但没有达到任何地方。

我正在考虑编写一个实现long-divison计算根的方法的代码,但这看起来非常低效且不优雅。

有人能建议我更简单有效地解决我的问题吗? 如果没有,那么有没有人尝试编码计算根的长分法?

Thanx提前!!

注意:这是一个我将在执行中多次使用的模板,因此效率对我来说更重要。

1 个答案:

答案 0 :(得分:2)

您的处理器是否支持EXSLT math:power()扩展功能?以下样式表:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="http://exslt.org/math"
extension-element-prefixes="math">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="num" select="32" />

<xsl:template match="/">
    <output>
        <xsl:value-of select="math:power($num, 2.4)" />
    </output>
</xsl:template>

</xsl:stylesheet>

将返回:

<强>的libxslt:

<?xml version="1.0" encoding="UTF-8"?>
<output>4096</output>

Saxon 6.5 / Xalan

<?xml version="1.0" encoding="UTF-8"?>
<output>4095.9999999999986</output>