iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
自我挑戰組

用 ODK 和 Access VBA 打造行動化資料收集流程系列 第 22

Day22: 表單函數(Functions) Part 2

  • 分享至 

  • xImage
  •  

重複問題群組(Repeat groups)

nodeset (節點集):
XML 節點的集合,在 XLSForms 中,這通常是回應值的集合。
在重複群組之外,按名稱引用問題將傳回包含該問題的所有回應的節點集。
也可以透過使用管道「|」連接兩個或多個節點來建立節點集:「/data/age | /data/name」。

indexed-repeat(name, group, i[, sub_grp, sub_i[, sub_sub_grp, sub_sub_i]])
傳回疊代 i 中重複群組中問題名稱的回應值。
可以使用 sub 和 sub_sub 參數存取巢狀重複組。

可參考 Referencing repeated questions from inside the repeat:
https://docs.getodk.org/form-repeats/#referencing-answers-in-repeats

count(nodeset)
傳回節點集(nodeset)中的項目數。
這可用於計算重複組中的重複次數。
https://docs.getodk.org/form-logic/#repeats

XLSFORM

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

count-non-empty(nodeset)
傳回節點集(nodeset)非空值的數量。

sum(nodeset)
傳回節點集(nodeset)成員的總和。
可用於統計重複選擇問題的答案。
https://docs.getodk.org/form-repeats/#counting-answers

XLSFORM
survey

type name label calculation
begin_repeat guest_details 賓客詳情
text guest_name 客人姓名
select_one meal_options meal_preference 膳食偏好
calculate chkn if(${meal_preference} = 'chicken', 1, 0 )
calculate fsh if(${meal_preference} = 'fish', 1, 0 )
calculate veg if(${meal_preference} = 'vegetarian', 1, 0 )
end_repeat
calculate chkn_count sum(${chkn})
calculate fsh_count sum(${fsh})
calculate veg_count sum(${veg})

choices

list_name name label
meal_options chicken
meal_options fish
meal_options vegetarian 素食

max(nodeset)
傳回節點集的最大成員。

min(nodeset)
傳回節點集的最小成員。
XLSFORM
survey

type name label calculation
begin_repeat child_questions 關於孩子的問題
text child_name 孩子的名字
integer child_age 孩子的年齡
end_repeat
calculate age_of_youngest_child min(${child_age})
calculate age_of_oldest_child max(${child_age})

注意
min() 和 max() 函數只處理數字集。
空值(即引用未回答問題的變數)實際上是空字串,並且不會自動轉換為零 (0)。

字串(Strings)

搜尋和匹配字串(Searching and matching strings)

regex(string, expression)

如果字串與表達式完全匹配,則傳回 True。
使用正規表示式: https://docs.getodk.org/form-regex/

XLSFORM
survey

type name label constraint constraint_message
text middle_initial 你的中間名首字母是什麼? regex(., '\p{L}') 只是第一個字母。

contains(string, substring)
如果字串包含子字串,則傳回 True。

starts-with(string, substring)
如果字串以子字串開頭,則傳回 True。

ends-with(string, substring)
如果字串以子字串結尾,則傳回 True。

substr(string, start[, end])
傳回從索引 start 開始並延伸到(但不包括)索引 end 的 string 的子字串(如果未提供 end,則返回 string 的終止位置)。
字串成員的索引為零。

substring-before(string, target)
傳回 string 中第一次出現目標子字串之前的子字串。
如果未找到目標,或者字串以目標子字串開頭,那麼這將傳回一個空字串。

substring-after(string, target)
傳回 string 中第一次出現目標子字串之後的子字串。
如果未找到目標,將傳回空字串。

translate(string, fromchars, tochars)
傳回字串的副本,其中 fromchars 中出現的每個字元都被 tochars 中相應的字元替換。
如果 fromchars 比 tochars 長,則 fromchars 中出現的每一個在 tochars 中沒有對應字元的字元都會被刪除。

string-length(string)
傳回字串中的字元數。
如果未傳入任何值,則傳回此函數呼叫所關聯的問題值中的字元數,這在約束表達式中可能很有用。

normalize-space(string)
通過去除字串的前導和尾隨空白,並將空白字元序列替換為單一空格,傳回具有規範化空白的字串。
如果沒有傳入任何值,則標準化此函數呼叫所關聯的問題值的空白。

組合字串(Combining strings)

concat(arg [, arg [, arg [, arg [...]]]])
將一個或多個參數連接成一個字串。
如果任何 arg 是節點集,則該集中的值將連接成一個字串。
join(separator, nodeset)
使用字串分隔符號連接節點集的成員。

與字串之間的轉換(Converting to and from strings)

boolean-from-string(string)
如果字串為“true”或“1”,則傳回 True,否則,錯誤。
string(arg)
將 arg 轉換為字串。

編碼和解碼字串(Encoding and decoding strings)

digest(data, algorithm, encoding method (optional))
使用指定的雜湊演算法字串計算並傳回資料字串的雜湊值,並使用可選的編碼字串對該雜湊值進行編碼。
演算法選項有 MD5、SHA-1、SHA-256、SHA-384、SHA-512。
如果不指定第三個參數,則編碼為base64。
編碼的有效選項是 base64 和 hex。
例如,如果有人想要從敏感資料(例如國民身分證號碼)建立唯一識別碼而不損害該數據,則此功能可能會很有用。

base64-decode(string)
使用 Base64 編碼方案對輸入中的所有位元組進行解碼,假設編碼的位元組表示 UTF-8 字元。
返回 UTF-8 字串。
extract-signed(string, public-key)
給定一個 Base64 編碼的簽章字串和公鑰作為輸入,驗證前 64 個位元組是否是有效的「Ed25519 https://en.wikipedia.org/wiki/EdDSA 簽章」。
如果簽名有效,則以 UTF-8 字串形式傳回內容的訊息(非簽名)部分。
如果簽章無效,則傳回空字串。

數學(Math)

注意
數學函數(number() 除外)僅適用於數值。
您可以使用 number() 將數字字串,轉換為數字,但通常最好直接取得數字值。
空值(即引用未回答問題的變數)實際上是空字串,並且不會自動轉換為零 (0)。

數字處理(Number handling)

round(number, places)
將小數四捨五入到一定的小數位數。
int(number)
截斷小數的小數部分以傳回整數。
number(arg)
將 arg 轉換為數值。
如果 arg 是數字字串,則傳回數字值。
如果 arg 為 True,則傳回 1。
如果 arg 為 False,則傳回 0。
如果 arg 無法轉換,則傳回 NaN(不是數字)。

計算(Calculation)

pow(number, power)
Raises a number to a power.
次方運算。
log(number)
Returns the natural log of number.
傳回number的自然對數。
log10(number)
傳回number以 10 為底的對數。
abs(number)
傳回number的絕對值。
sin(number)
傳回number的正弦值。
cos(number)
傳回number的餘弦值。
tan(number)
傳回number的正切值。
asin(number)
傳回number的反正弦值。
acos(number)
傳回number的反餘弦值。
atan(number)
傳回number的反正切值。
atan2(y, x)
傳回 y、x 的多值反正切值。
sqrt(number)
傳回number的平方根。
exp(x)
返回 e^x。
exp10(x)
返回10^x。
pi()
傳回數學常數 π 的近似值。


上一篇
Day21: 表單函數(Functions) Part 1
下一篇
Day23: 表單函數(Functions) Part 3
系列文
用 ODK 和 Access VBA 打造行動化資料收集流程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言