gpt4 book ai didi

xpath - 如何计算 XPath 或 XQuery 中的加权平均值?

转载 作者:行者123 更新时间:2023-12-03 16:19:18 24 4
gpt4 key购买 nike

我需要在 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 为空字符串的节点。例如,在下面使用 XPath avg() 函数进行的简单平均计算中,如果一个节点的内容是空字符串,我会得到一个错误(“无法将 '' 转换为 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

最佳答案

在 XPath 1.0 中使用:

  sum($currentBranche//Note[EleveId=$currentEleveId]/Valeur[number(.)=number(.)])

div

count($currentBranche//Note[EleveId=$currentEleveId]/Valeur)

在 Xpath 2.0 (XQuery) 中使用:

round(avg($currentBranche//Note[EleveId=$currentEleveId]/Valeur
[number(.)=number(.)])*100
) div 100

如果所有 Valeur 值都保证可转换为 xs:decimal,则使用:

avg($currentBranche//Note[EleveId=$currentEleveId]/Valeur
[castable as xs:decimal]
/xs:decimal(.)
)

在这种情况下,不会有(明显的)精度损失,您稍后可以使用 format-number() 函数来获取小数点后所需的位数。


二。产生“加权平均值”:

给定提供的 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>

此 XPath 2.0 表达式生成加权平均值:

   for $elevId in distinct-values(/*/*/*/*/EleveId)
return
round(100*
(sum(/*/*/*/Note
[EleveId eq $elevId
and number(Valeur) eq number(Valeur)
]
/(Valeur * ../../Coef)
)
div
sum(/*/*/*/Note
[EleveId eq $elevId
and number(Valeur) eq number(Valeur)
]
/../../Coef
)
)
)
div 100

并产生预期的正确结果:

5.33 5.1 2.8

关于xpath - 如何计算 XPath 或 XQuery 中的加权平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14122069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com