我的数据结构类似于:
<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处理器。
答案 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
功能。