No es posible utilizar ninguna función SQL/XML con nombre de etiqueta dinámico. Puedes usar un format
función.
postgres=# SELECT * FROM foo;
┌──────┬──────┐
│ nm │ val │
╞══════╪══════╡
│ buy │ 100 │
│ sell │ 1000 │
│ buy │ 102 │
│ sell │ 1033 │
└──────┴──────┘
(4 rows)
postgres=# SELECT xmlelement(name "trades", xmlagg(x))
FROM (SELECT format('<%1$s>%2$s</%1$s>',
nm,
xmlagg(xmlelement(name value, val)))::xml x
FROM foo group by nm) s;
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ xmlelement │
╞═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
│ <trades><sell><value>1000</value><value>1033</value></sell><buy><value>100</value><value>102</value></buy></trades> │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
(1 row)