This page is a work-in-progress reference for all available functions in XLS Forms. It is divided into the three possible sheets: survey, choices, and settings.


This sheet is mandatory in all XLSForms.

Category Item Description Works in Enketo? Works in Collect? Synonyms Notes
Column headers            
  type Sets the question type, see above yes yes    
  name Unique ID (name) of the question, is saved to XML yes yes    
  label::[language] Question or group label if using only one survey language, is displayed on screen yes yes   ::[language] is optional
  hint::[language] Hint for a question if using only one language yes yes   ::[language] is optional
  constraint Define the allowed values to a response yes yes    
  constraint_message::[language] The message a user is shown if the response was not valid yes yes constraint-msg ::[language] is optional
  required Whether a question has to be answered in order for the form to continue/be saved yes yes bind:required Allowed values: yes, no, TRUE, FALSE, true(), false(); or a statement that evaluates as true or false
  required_message::[language]] Allows to customize the error message if required question is not answered no yes requiredMsg ::[language] is optional
  default A default value that is pre-filled before the user gets to the question yes yes    
  relevant Skip logic condition (the relevant condition that needs to be fulfilled in order for the present question to be displayed) yes yes    
  read_only Whether a question response can be edited yes yes   Allowed values: yes, no, TRUE, FALSE, true(), false(); or a statement that evaluates as true or false
  calculation Only relevant for calculate questions: a mathematical expression that can be referenced elsewhere yes yes    
  repeat_count Number of repeats for a repeat group. In Collect it’s the exact number of repeats, in Enketo it’s a minimum. yes yes repeat-count Works in Enketo only if it’s an integer. In Collect it can be an integer or a dynamic reference.
  media::image An image to be shown with a question yes yes    
  media::audio Audio to be included with a question yes yes    
  media::video A video to be included with a question yes yes    
  media::image::language   yes yes   ::[language] is optional
  media::audio::language   yes yes   ::[language] is optional
  media::video::language   yes yes   ::[language] is optional
  appearance Defines the way questions are displayed (widgets), see below yes yes    
  instance::attribute include custom XML content for the data instance depends depends    
  bind::attribute include custom XML content for the bind attribute depends depends    
  body::attribute include custom XML content in the body depends depends    
  body::accuracyThreshold set the minimum GPS accuracy level before automatically registering the coordinates no yes    
Questions   These are put into the ‘type’ column        
Meta questions   These are hidden to the user, but otherwise work like regular questions        
  start Record when the form was loaded yes yes    
  end Record when the form was finished yes yes    
  today Record the date the form was loaded yes yes    
  deviceid Get the device ID (for Android devices) yes yes imei Enketo will generate a unique ID for a browser-device combo.
  username Get the user name (set in ODK settings) yes yes    
  subscriberid   no yes    
  simserial   no yes    
  phonenumber   no yes phone_number TBC: phone_number
Regular questions            
  select_one [choices] [or_other] User can choose one of several choices yes yes select one  
  select_multiple [choices] [or_other] User can choose one or more of several choices yes yes select multiple  
  select_one_external   no yes    
  text User can enter a text response yes yes    
  integer User can enter an integer yes yes    
  decimal User can enter a decimal number yes yes    
  date User can enter a date yes yes    
  time User can enter a time of day yes yes    
  datetime User can enter date and time together yes yes    
  geopoint User can record a GPS location yes yes location  
  image User can take or attach a picture yes yes photo  
  audio User can record or attach audio yes yes    
  video User can record or attach video yes yes    
  note User is shown a note (no response possible) yes yes    
  barcode User can enter a barcode by scanning it yes yes    
  acknowledge User is asked to confirm or acknowledge something yes yes trigger In Enketo this is displayed as a note
  calculate A mathematical expression of existing values that can be used by other questions (no user input) yes yes   Calculate creates an instance variable with no body element that gets set by an xpath expression (specified in the calculation column)
  geotrace User can record a line or polyline or multiple geo points yes yes    
  geoshape User can record a polygon of multiple geo points - the last point is the same as the first point yes yes    
Groups   Groups contain one or more questions, or other nested groups, which may loop (repeat)        
  begin_group Sets the beginning of a group yes yes begin group  
  end_group Ends the group yes yes end group  
  begin_repeat Sets the beginning of a repeat group yes yes    
  end_repeat Ends the repeat group yes yes    
Form Variable References            
  ${variable_name} Reference another question (can be used in skip logic condition [relevant], validation, inside another question or hint label yes yes    
  . Current question yes yes    
Appearance           (For more controlled views using widgets)
  field-list Multiple questions of a group on a screen yes yes   Needs to be applied to a group
  table-list Show multiple select1s with a shared label in a field list. yes yes   Needs to be applied to a group
select_one / select_multiple            
  minimal Spinner widget - click button to provide a response yes yes    
  label Table of answers yes yes    
  list-nolabel Goes with label, no label on answer just radios yes yes    
  autocomplete Autocomplete widget no yes   Does this work?
  autocomplete_chars Autocomplete widget with chars option no yes   Does this work?
  likert Shows question as likert widget yes no    
  horizontal Displays choices horizontally and automatically creates neat columns for multiple rows yes yes    
  horizontal-compact Displays choices horizontally as compact as possible yes no    
  compact-2 Grid widget with max 2 columns no yes    
  quick Auto advance to next question upon selection yes yes    
  numbers Show the number keyboard on the device no yes    
  multiline Creates a larger text entry field yes no    
  printer Interface with an external (Zebra barcode) printer no yes   Is this available in XLSForm?
  distress Shows a thermometer allowing entries 0-10 yes no    
  no-calendar allows to force older spinner-only display on newer 4.x devices no yes    
  month-year Together with ‘date’ question type, doesn’t display the day of the month. yes yes   On Enketo only works on desktop devices - mobile devices use native full date picker
  year Together with ‘date’ question type, only displays the year. yes yes   On Enketo only works on desktop devices - mobile devices use native full date picker
  annotate Draw on a captured Image no yes    
  draw Draw something on the screen no yes    
  signature Draw a signature on a line no yes    
geopoint, geotrace, geoshape            
  maps Records the GPS location while showing it also in Google Maps yes yes   Enketo: Adds a button on touch screens to see a map; for non-touch devices it’s the same as having no appearance.
  hide-input Shows a larger map and hides the geo input fields by default. yes no    
  streets, terrain, satellite, [other] Switches the default map layer to the one with the name of the appearance. yes no    
  placement-map Allows user to point at a location on a map yes yes   Enketo: Same as maps
Skip logic syntax (incomplete)            
  selected (${some_question}, ‘d’) for multi select questions yes yes    
  ${some_other_question} = ‘1’   yes yes    
Calculation commands           Full list being established at
  date-time   yes yes    
  decimal-date-time   no yes    
  once() forces (random?) calculation to be done just once yes yes    
  indexed-repeat() Returns a single node from a nodeset by selecting the 1-based index of a repeat nodeset. It does this up to 3 repeat levels deep. yes yes   indexed-repeat(nodeset arg, nodeset repeat1, int index1, [nodeset repeatN, int indexN]{0,2})
  count() Allows counting the number of repeat groups yes yes    
  count-selected() Counts the number of responses to a select_multiple question yes yes    


The choices sheet is optional and only required if there are any select_one or select_multiple questions in the file.

Item Description Works in Enketo? Works in Collect? Synonyms Notes
list name A unique name for each set of choices yes yes list_name  
name ID (name) of the specific choice, will be saved to XML yes yes    
label::[language] Choice label, will be displayed on screen. Allows adding a translation of choice labels, showing [language] in the interface yes yes label::[language]  
media   yes yes   optional
[filter_category_name] Allows setting a specific parent category for choice filters (cascading questions) yes yes   Column name is specified by user, e.g. ‘country’


The settings sheet and all of its items are optional.

Item Description Works in Enketo? Works in Collect? Synonyms Notes
form_title Title displayed at beginning of form, in form list yes yes   if missing assigned to form_id
form_id ID used in the XML and often needs to be unique yes yes   If missing assigned to xls name
public_key Key required for encrypted forms no yes    
submission_url Specific URL for uploading data, overrides ODK settings no yes    
default_language If form uses multiple languages, this one sets which to use by default yes yes    
style Separate questions groups into pages (on Enketo). Switch to a different theme. yes no   Allowed values: pages, theme-grid, theme-formhub
version   yes yes    
instance_name Allows user to create a dynamic naming convention for each submitted instance ? yes   for example, concat(${lname}, ‘-‘, ${fname}, ‘-‘, uuid())
sms_keyword   no ?    
sms_separator   no ?    
sms_allow_medias   no ?    
sms_date_format   no ?    
sms_datetime_format   no ?    
sms_response   no ?