1

我是 ODK 和 XLSForms 的新手。

我有几个问题,根据答案,我需要计算一个分数。

我有 17 个问题,每次有人回答是,我需要在一个整数字段中添加 2 分。

所以我有:

type                name  label           appearnce           required

select_one yes_no1  q1    //question here //appearance quick //required yes

...

select_one yes_no17 q17 ...

这是分数字段:

type      name    label

calculate total   Total

这是我工作中的第一个任务,无法根据所选答案计算和更改值。

编辑

我添加了一个计算表达式,但不知道如何得到结果,因为它不起作用:

if ((${q8} = 'yes' or ${q9} ='yes' or ${q11}='yes'), 2, 0)

因此,如果问题 8、9 或 11 的回答为“是”,则在当前值上加 2 分,但该字段根本没有出现。如果第 10、12、13 和 14 题的回答为“是”,则仍需加分,每题加 1 分。

4

1 回答 1

1

执行此操作的简单但繁琐的方法是使用 if() 语句为每个问题创建一个计算,该语句将计算值设置为 2 或 0。可以通过将计算项相加来获得最终结果。

一种很酷的方法是在一个 XPath 表达式中完成所有操作。基本上,您想创建一个包含所有 17 个问题的节点集,将它们过滤为值为“是”的问题,计算过滤后的节点集并乘以 2。您可以在 XLSForm 中执行此操作,但我不确定您是否可以使用 $ {node} 简写。

您必须将所有问题放在一个组中(不需要组标签),之后您可以执行以下操作:

count(${grp}/*[text() = 'yes']) * 2

或者没有 ${node} 快捷方式(检查 XForm 以获取正确的路径):

count(/myform/grp/*[text() = 'yes']) * 2

I'm not sure if the use of text() will pass ODK Validate though. If not there is probably an expression that will pass and does the same. (However, the above syntax would work in Enketo).

于 2017-04-12T20:45:31.110 回答