我可以在XSLT中执行元素划分吗?

时间:2010-02-10 18:12:50

标签: xslt

我的数据结构类似于:

<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)),但XSLT似乎不允许逐元素划分,我该如何计算这个平均值?

如果有帮助,我将Saxon用作XSLT 2.0处理器。

2 个答案:

答案 0 :(得分:3)

以下将做你想要的......

它使用递归并连续添加所有配对计算,最后除以结果数。

<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>

如果有部分你不明白,请告诉我。

答案 1 :(得分:0)

一个有效的简短解决方案似乎是这样的:

<?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功能。