代码之家  ›  专栏  ›  技术社区  ›  Mark Elliot

我可以在XSLT中执行元素除法吗?

  •  4
  • Mark Elliot  · 技术社区  · 16 年前

    我有一个数据结构,看起来像:

    <resultSet>
      <result>
        <numCorrect>1</numCorrect>
        <truthCorrect>4</truthCorrect>
      </result>
      <result>
        <numCorrect>2</numCorrect>
        <truthCorrect>4</truthCorrect>
      </result>
      <result>
        <numCorrect>3</numCorrect>
        <truthCorrect>5</truthCorrect>
      </result>
      <result>
        <numCorrect>5</numCorrect>
        <truthCorrect>6</truthCorrect>
      </result>
    </resultSet>
    

    我想计算一下 avg((result/numCorrect) div (result/truthCorrect))

    如果有帮助,我将使用Saxon作为XSLT2.0处理器。

    2 回复  |  直到 16 年前
        1
  •  3
  •   Gabriele Petrioli    16 年前

    它使用递归并串行添加所有成对计算,最后除以结果数。。

    <xsl:template match = "/resultSet" >
      <xsl:variable name="TotalSum">
        <xsl:call-template name="calculator">
          <xsl:with-param name="currSum">0</xsl:with-param>
          <xsl:with-param name="count"><xsl:value-of select="count(result)"/></xsl:with-param>
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="$TotalSum div count(result)"/>
    </xsl:template>
    
    <xsl:template name="calculator">
      <xsl:param name="currSum"/>
      <xsl:param name="count"/>
    
      <xsl:variable name="actual" select="number(result[number($count)]/numCorrect)"/>
      <xsl:variable name="truth" select="number(result[number($count)]/truthCorrect)"/>
    
      <xsl:variable name="singleResult" select="number($actual div $truth)"/>
    
      <xsl:variable name="CycleSum" select="number($currSum + $singleResult)"/>
    
      <xsl:choose>
        <xsl:when test="number($count - 1) > 0 ">
          <xsl:call-template name="calculator">
            <xsl:with-param name="currSum"><xsl:value-of select="$CycleSum"/></xsl:with-param>
            <xsl:with-param name="count"><xsl:value-of select="number($count - 1)"/></xsl:with-param>
          </xsl:call-template>
        </xsl:when>
        <xsl:otherwise><xsl:value-of select="$CycleSum"/></xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    

    如果有你不明白的地方,请告诉我。。

        2
  •  0
  •   Mark Elliot    16 年前

    一个简单有效的解决方案似乎是:

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:exslt="http://exslt.org/common">
    
        <xsl:template match="/resultSet">
    
            <xsl:variable name="foo">
                <xsl:for-each select="result">
                    <n><xsl:value-of select="numCorrect div truthCorrect" /></n>
                </xsl:for-each>
            </xsl:variable>
    
            <xsl:value-of select="avg(exslt:node-set($foo)/n)" />
    
        </xsl:template>
    
    </xsl:stylesheet>
    

    哪里 <xsl:value-of select="avg(exslt:node-set($foo)/n)" />

    <xsl:value-of select="sum(exslt:node-set($foo)/n) div count(result)" />
    

    如果您使用的XSLT引擎支持exslt扩展,但没有非标准的 avg