2010-02-10 18 views
4

我有一个数据结构,它看起来像:我可以在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处理器。

回答

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> 

让我知道,如果有有部分你不明白..

+0

感谢,作品像一个魅力。 – 2010-02-10 19:05:41

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)" /> 

,如果你使用的是支持EXSLT扩展,但不具有非标准avg功能的XSLT引擎所取代。

相关问题