2010-02-10 4 views
4

J'ai une structure de données qui ressemble à quelque chose comme:Puis-je effectuer une division élémentaire dans 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> 

Je voudrais calculer avg((result/numCorrect) div (result/truthCorrect)), mais XSLT ne semble pas permettre la division élément par élément, comment puis-je calculer cette moyenne?

Si cela aide, j'utilise Saxon comme un processeur XSLT 2.0.

Répondre

3

Ce qui suit va faire ce que vous voulez ..

Il utilise la récursivité et ajoute en série tous les calculs jumelés et à la fin divise par le nombre de résultats ..

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

Laissez-moi savoir s'il sont des pièces que vous ne comprenez pas ..

+0

merci, fonctionne comme un charme. –

0

Une solution à court forme qui fonctionne semble être ceci:

<?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)" /> peut être remplacé par

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

si vous utilisez un moteur XSLT qui prend en charge les extensions EXSLT mais ne dispose pas de la fonction non standard avg.

Questions connexes