So sorry, this is probably the messiest area of ODK. The instance
syntax has been part of the form specification since its very beginnings. It's really general -- you can use it to get values from any kind of list of values that can be represented: choices from the choice list, attached CSVs, attached geoJSON, etc. You can also filter the list in many different ways.
pulldata
was introduced to Collect as a way to get better performance for the common case of getting a single value out of a CSV by doing an exact match between two values. It can be used in place of instance
expressions that have an expression in square brackets like "column = ${some_form_value}". In Collect, it uses a database representation of the CSV data and so can be used with larger CSVs.
In Enketo, pulldata
was introduced as a shortcut to the corresponding instance
expression. Because pulldata
is more constrained than instance
, Enketo uses the browser's built-in, optimized evaluator directly to evaluate it. On the other hand, instance
expressions not from pulldata
use a wrapper on that evaluator. The only thing I can think of to explain the behavior you're experiencing at the moment is that apostrophes are causing a problem for the browser evaluator.
It has been our dream for a long time to truly make pulldata
truly identical to its corresponding instance
expression. This will be the case in web forms and we're getting close to being able to do that in Collect as well.
The only known difference is performance. Anything else you should definitely let us know about.