ODK 表單可以透過多種方式使用資料集。這些資料集可以位於表單內部或外部。內部資料集在 XLSForm 的選擇表中定義,通常用作選擇的選項。
您也可以在選擇表中定義資料集,以根據使用者輸入查找值。了解如何在選擇部分定義內部資料集。
外部資料集在以下情況下很有用:
以下所述的所有技術都適用於實體清單(Entity Lists)。
實體清單可以被視為由 ODK Central 管理的 CSV,以便可以在同一專案中的其他表單中自動存取透過一個表單提交收集的資料。
CSV 檔案可用作使用 select_one_from_file 或 select_multiple_from_file 的選擇小工具的資料集。
以這種方式使用的 CSV 檔案必須具有name和label欄位,除非您使用parameters 欄位來自訂所使用的欄位名稱。
對於資料集中的每一行,值列中的文字(預設為name欄位)將用作選擇該選項時儲存的值,標籤列中的文字(預設為label欄位)將用於顯示該選項。
對於多重選擇項目,name 欄位的內容不得包含空格。
這些文件也可能具有在 choice filters或其他表達式中使用的任意數量的附加列。
下面的範例使用內部選擇中的一項,然後從兩個不同的外部 CSV 檔案中進行選擇。
survey
type | name | label | choice_filter |
---|---|---|---|
select_one states | state | State | |
select_one_from_file lgas.csv | local_gov_area | Local Government Area | state=${state} |
select_multiple_from_file wards.csv | wards | Wards | lga=${local_gov_area} |
choices
list_name | name | label | population |
---|---|---|---|
states | abia | Abia | 4112230 |
states | ebonyi | Ebonyi | 2176947 |
lgas.csv
name | label | state |
---|---|---|
aba_n | Aba North | abia |
aba_s | Aba South | abia |
afikpo_n | Afikpo North | ebonyi |
wards.csv
name | label | lga |
---|---|---|
eziama | Eziama | aba_n |
umuogor | Umuogor | aba_n |
ezeke_amasiri | Ezeke amasiri | afikpo_n |
poperi_amasiri | Poperi amasiri | afikpo_n |
##從 GeoJSON 檔案中建立選擇項目##
遵循 GeoJSON 規範的 GeoJSON 檔案可用作使用 select_one_from_file 填入選擇問題的資料集。
來自 GeoJSON 的選擇可以使用地圖外觀將樣式設為地圖,但也可以使用任何其他選擇外觀。
為了供表單使用,GeoJSON 檔案:
survey
type | name | label |
---|---|---|
select_one_from_file museums.geojson | museum | Select the museum closest to you |
表單中引用的 GeoJSON 檔案可以具有任意數量的功能和任意數量的自訂屬性。
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [
7.0801379,
46.5841618
]
},
"properties": {
"id": "fs87b",
"title": "HR Giger Museum",
"annual_visits": 40000
}
}
]
}
所有屬性均透過從地圖問題中選擇來顯示,並且可以由表單的任何部分引用。
特徵的幾何圖形可以作為幾何圖形進行訪問,並以 ODK 格式提供。
給定上面的 GeoJSON 檔案和表單定義,如果使用者選擇“HR Giger Museum”,則 ${museum} 的值將為“fs87b”。
表達式 instance('museums')/root/item[id=${museum}]/geometry 的計算結果為 46.5841618 7.0801379 0 0,這是 ODK 格式中的一個點。
XML 檔案可作為使用 select_one_from_file 或 select_multiple_from_file 填入選擇問題的資料集。
這通常不如使用 CSV 檔案方便。
但是,了解 XML 表示形式有助於理解如何在 CSV 和 XML 檔案中找到值。
用於選擇的 XML 檔案必須具有以下結構,並且可以具有任意數量的項目區塊:
<root>
<item>
<name>...</name>
<label>...</label>
...
</item>
...
</root>
項目區塊類似於 CSV 表示形式中的行。
每個項目必須至少具有名稱和標籤巢狀節點,並且可以具有任意數量的附加節點。
這些節點對應於 CSV 表示形式中的欄位。
您可以在內部或外部資料集中尋找值。您通常會在calculate (計算)欄位中執行此操作,但您也可以直接在labels(標籤)中尋找值以將其顯示給使用者或在約束或其他表達式中包含查找的值。
用於在資料集中尋找值的表達式始終以 instance("")開頭,以標識正在存取哪個資料集。
如果您有一個名為places的選擇清單或一個檔案名為places.csv的附加CSV,您的尋找表達式將以instance("places")開頭。
表達式的下一部分是 /root/item 。這意味著要考慮您的選擇清單或附加文件中的每一item (項目)。
然後,您通常需要在方括號中新增一個篩選器來指定實際使用的項目。例如,如果您有一個名為 states 的選擇清單或附加文件,並且想要尋找有關使用者在名為 my_state 的表單欄位中輸入的州的值,則可以使用 name = ${my_state} 作為choice_filter(篩選器)表達式。這與您編寫為 choice_filter 的表達式完全相同。
您的過濾表達式可能會導致選擇一項或多項。過濾到包含多個項目的結果對於求和和計數特別有用。
例如,要計算州人口超過特定閾值的數量:
count(instance("states")/root/item[population > ${pop_threshold}])
若要使用所選項目中的單一值,請指定篩選器後要使用的列/屬性。
例如,如果您想尋找使用者填寫為 my_state 的州的人口,則完整表達式為:
instance("states")/root/item[name = ${my_state}]/population
要取得人口超過特定閾值的各州的總人口:
sum(instance("states")/root/item[population > ${pop_threshold}]/population)
您無需深入了解這些表達式的細節即可有效地使用它們。
如果您有興趣了解更多信息,請參閱有關 XPath 路徑(https://docs.getodk.org/form-logic/#xpath-paths)的部分。
特別是,/root/item 來自用於表示選擇資料集的 XML 結構(https://docs.getodk.org/form-datasets/#selects-from-xml)。
如果將自訂 XML 檔案附加到表單,則可能有不同的根節點名稱。
如果您想直接在 CSV 中尋找值而不先執行選擇步驟,您可以使用 csv-external 附加該 CSV:
survey
type | name | label | calculation |
---|---|---|---|
csv-external | people | ||
barcode | person_id | Scan person's ID card | |
calculate | person_fname | instance("people")/root/item[code=${person_id}]/fname |
上面的範例表單附加了一個檔案名為 people.csv 的 CSV 或名為 people 的實體清單(https://docs.getodk.org/central-entities/)。
然後,它提示使用者掃描身分證上的條碼,並使用身分證上的值來尋找對應人員的名字。
如果附加實際的 CSV 文件,它必須包含名為 fname 和 code 的欄位。
同樣,如果使用實體列表,則該實體列表必須具有名為 fname 和 code 的屬性。
注意
若要附加名為 people.xml 的 XML 文件,請將上面的 csv-external 替換為 xml-external。