2010-02-10 23 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引擎所取代。

相關問題