若要驗證或限制回應值,請使用constraint(約束)欄位。當使用者點按鈕要切下一個畫面時,將檢查約束表達式,如果表達式的計算結果為 True,則表單將正常前進,如果為 False,則表單不會前進,並顯示constraint_message欄位的內容。
例如:
「. >= 18」:如果回答大於或等於 18,則為 True。
「. > 20 and . < 200」:如果回答介於 20 到 200 之間,則為 True。
「regex(.,'\p{L}+')」:如果回應僅包含字母,不包含空格、分隔符號或數字,則為 true。
「not(contains(., 'prohibited'))」:如果禁止的子字串未出現在回應中,則為 true。
「not(selected(., 'none') and count-selected(.) > 1)」:如果回應不包含任何選擇或任何其他選擇,則為 False。
注意
如果回應空白,則不會檢查約束。若要限制空白回答,請將問題設為必填(required)。
技巧
對於「柔性」約束或警告,請使用在違反「柔性」約束時相關的註釋問題。例如,您可以顯示一條註解(note),表示允許參與者的年齡為 110 歲,但可能性不大。
註解也可用於「強硬」約束,這些約束應永久顯示,直到使用上述技術和 true() 所需的設定解決它們為止。例如,如果百分比總計不是 100,您可以顯示註釋,並要求普查員修正輸入值。
使用正規表達式(Using regular expressions):https://docs.getodk.org/form-regex/
type | name | label | constraint | constraint_message |
---|---|---|---|---|
text | middle_initial | 你的中間名首字母是什麼? | regex(., '\p{L}') | 只要第一個字 |
若要完全限制使用者輸入,請增加read_only 欄位,並使用yes值。這通常與預設回應相結合,預設回應通常是根據先前的回應計算出來的。
type | name | label | read_only | default | calculation |
---|---|---|---|---|---|
decimal | salary_income | Income from salary | |||
decimal | self_income | Income from self-employment | |||
decimal | other_income | Other income | |||
calculate | income_sum | ${salary_income} + ${self_income} + ${other_income} | |||
decimal | total_income | Total income | yes | ${income_sum} |
relevant (相關)欄位可基於先前回應的問題與問題群組,來決定目前問題要顯示或隱藏。
如果 relevant (相關)欄位的表達式計算結果為 True,則會顯示問題或群組。如果為 False,則不顯示問題。
通常,比較運算子(https://getodk.github.io/xforms-spec/#xpath-operators )用於相關表達式中,例如:
「${age} <= 5」: 若年齡為五歲或以下,則為True
「${has_children} = 'yes'」: 如果 has_children 的答案是 yes,則為True
相關表達式也可以使用函數(https://docs.getodk.org/form-operators-functions/#form-functions)。例如:
「selected(${allergies}, 'peanut') 」:如果在名為過敏的多重選擇小工具中選擇了花生(peanut),則為 true。
「contains(${haystack}, 'needle') 」: 如果haystack 的回應中的任何位置有「needle」字串,則為 True。
「count-selected(${toppings}) > 5」:如果在名為 toppings 的多選小工具中選擇了五個以上選項,則為 True。
XLSForm
survey
type | name | label | relevant |
---|---|---|---|
select_one yes_no | watch_sports | 你看體育比賽嗎? | |
text | favorite_team | 你最喜歡哪支球隊? | ${watch_sports} = 'yes' |
choices
list_name | name | label |
---|---|---|
yes_no | yes | Yes |
yes_no | no | No |
XLSForm
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 | 癌症 |
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 型(胰島素抗性) |
若要將問題分組,請使用 begin_group與end_group 語法。
XLSForm — 問題分組
type | name | label |
---|---|---|
begin_group | my_group | 我的文字小工具 |
text | Question_1 | 文字小工具 1 |
text | Question_2 | 這些問題將會分組在一起 |
end_group |
您可以使用群組上的欄位清單( field-list )外觀在同一螢幕上顯示多個問題。
如果begin_group有設定標籤 (label),群組將在表單路徑中可見,可協助判斷目前位置(例如:我的文字小工具 > 文字小工具 1)。帶有標籤的群組也會在跳頁選單中顯示為可點選的項目:
沒有標籤的群組有助於以使用者不可見的方式組織問題。此技巧有助於表單的內部組織。這些組別也可以是有條件地顯示某些問題的便捷方式。