{at 'path'} answers the value an @ expression points at - the same notation a
field can carry, {$name@staff}, written as a tag with the path as a quoted
parameter. The part after the @ says where to look: a data set made with
{data}, an array of the page, a _data/ file, a stored
sequence, or an enclosing level by name.
The part before the @ is a path through that data, its steps separated by
dots. A plain step is a field name - owner.phone@shop descends into the
owner object. A step id='b2' picks, among the rows at that point, the
one whose id field is b2, so {at "id='b2'.name@staff"} is
the name of the row with that id. Steps can be chained as deep as the data goes:
{at "country.id='f0_162'.province.id='f0_17460'.name@mondial"}. A row can also be
named by its key - 1.city@cities - and @globals searches the page's
variables: {at 'order.total@globals'}. In a {data} set a bare field
name searches the rows and answers the first one that has it.
The tag asserts its path: under the strict syntax check a path that reaches nothing - or an
empty value - is an error naming the path. The field form ({$name@staff}) is
searched more leniently, which is what optional lookups rest on. Use the
lookup pipe to find one row by a key for every row of a loop.