表單函數包含了主要的流程控制、重複群組、字串處理、數字處理、日期處理、地理工具、其他工具等項目,這部份我依然照ODK Docs的文件翻譯下去。
原始文件請參考:Functions in the ODK XForm Specification
https://getodk.github.io/xforms-spec/#xpath-functions
if(expression, then, else)
如果expression(表達式)計算結果為 True,則傳回 then,否則,返回 else。
position(xpath)
傳回一個整數,該整數等於 xpath 定義的節點中目前節點的1-indexed位置。
最常見的是,它以position(..) 的形式使用來標識重複問題組內的目前疊代索引。
type | name | label | repeat_count | calculation |
---|---|---|---|---|
note | person_list_note | 請列出您家中人員的姓名。 | ||
begin_repeat | person | 家庭成員 | ||
text | name | 姓名 | ||
end_repeat | ||||
begin_repeat | person_details | 細節 | count(${person}) | |
calculate | current_name | indexed-repeat(${name}, ${person}, position(..)) | ||
date | member_bday | ${current_name}的生日 | ||
end_repeat | ||||
once(expression) | ||||
如果問題的值為空,則傳回值表達式,否則,傳回問題的目前值。 | ||||
這可用於確保隨機數僅產生一次,或以即使稍後回應發生變更也可檢索的方式儲存為問題輸入的第一個值。 |
注意
這個函數經常被誤,請閱讀何時評估表達式以了解更多資訊:
https://docs.getodk.org/form-logic/#when-expressions-are-evaluated
####存取回應值(Accessing response values)
注意
大多數問題類型的資料存取都可以使用變數來存取。
需要使用函數來存取的為多選問題和重複組內問題的回答。
selected(space_delimited_array, string)
如果 string 是 space_delimited_array 的成員,則傳回 True,否則傳回 False。
通常用於確定是否在選擇問題中,選擇了特定選項,因為選擇問題的參考值會傳回以空格分隔的選擇名稱數組。
survey
type | name | label | hint | relevant | constraint |
---|---|---|---|---|---|
select_multiple medical_issues | what_issues | 您是否經歷過以下情況? | 選擇所有適用的選項。 | ||
select_multiple cancer_types | what_cancer | 您曾患過什麼類型的癌症? | 選擇所有適用的選項。 | selected(${what_issues}, 'cancer') | |
select_multiple diabetes_types | what_diabetes | 您患有什麼類型的糖尿病? | 選擇所有適用的選項。 | selected(${what_issues}, 'diabetes') | |
begin_group | blood_pressure | 血壓讀數 | selected(${what_issues}, 'hypertension') | ||
integer | systolic_bp | 收縮壓 | . > 40 and . < 400 | ||
integer | diastolic_bp | 舒張壓 | . >= 20 and . <= 200 | ||
end_group | |||||
text | other_health | 列出其他問題。 | selected(${what_issues}, 'other') | ||
note | after_health_note | This note is after all health questions. |
choices
list_name | name | label |
---|---|---|
medical_issues | cancer | Cancer |
medical_issues | diabetes | 糖尿病 |
medical_issues | hypertension | 高血壓 |
medical_issues | other | 其他 |
cancer_types | lung | 肺癌 |
cancer_types | skin | 皮膚癌 |
cancer_types | prostate | 攝護腺癌 |
cancer_types | breast | 乳癌 |
cancer_types | other | 其他 |
diabetes_types | type_1 | 1 型(胰島素依賴性) |
diabetes_types | type_2 | 2 型(胰島素抗性) |
selected-at(space_delimited_array, n)
傳回 space_delimited_array 第 n 個位置的字串。
(該陣列為zero-indexed。)如果索引不存在,則傳回空字串。
這可用於從多選問題中取得所選選項的名稱,因為選擇問題的參考會傳回以空格分隔的選擇名稱數組。
筆記
如果用於從選擇問題中取得選項名稱(name),則此函數會傳回所選選項的名稱,而不是標籤(label)。
若要取得目前語言的標籤(label),請使用 jr:choice-name()函數。
XLSFORM
survey
type | name | label | hint | calculation |
---|---|---|---|---|
select_multiple colors | color_prefs | 你喜歡什麼顏色? | 選擇三個。 | |
calculate | color_0 | selected-at(${color_prefs}, 0) | ||
calculate | color_1 | selected-at(${color_prefs}, 1) | ||
calculate | color_2 | selected-at(${color_prefs}, 2) | ||
note | color_note | 所選顏色: | ${color_0} ${color_1} ${color_2} |
choices
list_name | name | label |
---|---|---|
colors | red | 紅色 |
colors | blue | 藍色 |
colors | yellow | 黃色 |
colors | green | 綠色 |
colors | orange | 橘子 |
colors | purple | 紫色 |
count-selected(multi_select_question)
傳回在 multi_select_question 中選擇的選項數。
XLSFORM
survey
type | name | label | hint | constraint | constraint_message |
---|---|---|---|---|---|
select_multiple colors | color_prefs | 你喜歡什麼顏色? | 選擇三個。 | count-selected(.)=3 | 需要正好選三個。 |
choices
list_name | name | label |
---|---|---|
colors | red | 紅色 |
colors | blue | 藍色 |
colors | yellow | 黃色 |
colors | green | 綠色 |
colors | orange | 橘子 |
colors | purple | 紫色 |
jr:choice-name(choice_name, 'select_question')
以使用的語言傳回與 select_question 的選項清單中的 choice_name 關聯的標籤值(label)。
注意
您必須將 select_question括在引號中:
'${question_name}'
XLSFORM
survey
type | name | label::English | label::Español | hint::English | hint:Español | calculation |
---|---|---|---|---|---|---|
select_multiple colors | color_prefs | What colors do you like? | ¿Qué colores te gustan? | Select three. | Seleccione tres. | |
calculate | color_0 | jr:choice-name( selected-at(${color_prefs}, 0), '${color_prefs}') | ||||
calculate | color_1 | jr:choice-name( selected-at(${color_prefs}, 1), '${color_prefs}') | ||||
calculate | color_2 | jr:choice-name( selected-at(${color_prefs}, 2), '${color_prefs}') | ||||
note | color_note | Selected colors: | Colores seleccionados: | ${color_0} ${color_1} ${color_2} | ${color_0} ${color_1} ${color_2} |
choices
list_name | name | label::English | label::Español |
---|---|---|---|
colors | red | Red | Rojo |
colors | blue | Blue | Azul |
colors | yellow | Yellow | Amarillo |
colors | green | Green | Verde |
colors | orange | Orange | Anaranjado |
colors | purple | Purple | Púrpura |