我需要以 XForms 形式计算一个简单的加权平均值。如何使用 XPath 和/或 XQuery 以优雅和声明性的方式做到这一点?
[编辑] 这是源 XML 文档:
<Examens>
<Examen>
<ExamenId>1</ExamenId>
<Coef>1</Coef>
<Notes>
<Note>
<EleveId>100</EleveId>
<Valeur>4</Valeur>
</Note>
<Note>
<EleveId>101</EleveId>
<Valeur>4.2</Valeur>
</Note>
<Note>
<EleveId>102</EleveId>
<Valeur>3.8</Valeur>
</Note>
</Notes>
</Examen>
<Examen>
<ExamenId>2</ExamenId>
<Coef>2</Coef>
<Notes>
<Note>
<EleveId>100</EleveId>
<Valeur>5</Valeur>
</Note>
<Note>
<EleveId>101</EleveId>
<Valeur/>
</Note>
<Note>
<EleveId>102</EleveId>
<Valeur>3.5</Valeur>
</Note>
</Notes>
</Examen>
<Examen>
<ExamenId>3</ExamenId>
<Coef>3</Coef>
<Notes>
<Note>
<EleveId>100</EleveId>
<Valeur>6</Valeur>
</Note>
<Note>
<EleveId>101</EleveId>
<Valeur>5.4</Valeur>
</Note>
<Note>
<EleveId>102</EleveId>
<Valeur>2</Valeur>
</Note>
</Notes>
</Examen>
</Examens>
以下代码段正确显示了值 (= ./Valeur
) 和权重 (= ./../../Coef
) :
<xforms:repeat nodeset="$currentBranche//Note[EleveId=$currentEleveId]">
<xforms:output ref="./Valeur"/>
<xforms:output ref="./../../Coef"/>
</xforms:repeat>
顺便说一句,我还需要排除Valeur
空字符串的节点。例如,在下面使用 XPathavg()
函数的简单平均计算中,如果一个节点的内容是空字符串,我会得到一个错误(“无法将 '' 转换为 double”)。这是一个问题,因为节点存在(它是模型实例的一部分)并且当用户尚未输入值时该值是空字符串。
<xforms:output ref="round(avg($currentBranche//Note[EleveId=$currentEleveId]/Valeur)*100) div 100"/>
[编辑]
正确的计算是:
如果 EleveId=100 : 加权平均 = (1*4+2*5+3*6) / (1+2+3) =
5.333 如果 EleveId=101 : 加权平均 = (1*4.2+3*5.4) / ( 1+3) = 5.1
如果 EleveId=102 :加权平均 = (1*3.8+2*3.5+3*2) / (1+2+3) = 2.8