I just tested this and cannot recreate the issue. The sortable headers are generated correctly and work as expected:
<table class="table">
<thead>
<tr>
<th class="sorting" dmx-on:click="query1.set('sort','id');query1.set('order',query1.data.order == 'desc' ? 'asc' : 'desc')" dmx-class:sorting_asc="query1.data.sort=='id' && query1.data.order == 'asc'" dmx-class:sorting_desc="query1.data.sort=='id' && query1.data.order == 'desc'">Id</th>
<th class="sorting" dmx-on:click="query1.set('sort','airport');query1.set('order',query1.data.order == 'desc' ? 'asc' : 'desc')" dmx-class:sorting_asc="query1.data.sort=='airport' && query1.data.order == 'asc'" dmx-class:sorting_desc="query1.data.sort=='airport' && query1.data.order == 'desc'">Airport</th>
<th class="sorting" dmx-on:click="query1.set('sort','city');query1.set('order',query1.data.order == 'desc' ? 'asc' : 'desc')" dmx-class:sorting_asc="query1.data.sort=='city' && query1.data.order == 'asc'" dmx-class:sorting_desc="query1.data.sort=='city' && query1.data.order == 'desc'">City</th>
<th class="sorting" dmx-on:click="query1.set('sort','country');query1.set('order',query1.data.order == 'desc' ? 'asc' : 'desc')" dmx-class:sorting_asc="query1.data.sort=='country' && query1.data.order == 'asc'" dmx-class:sorting_desc="query1.data.sort=='country' && query1.data.order == 'desc'">Country</th>
</tr>
</thead>
<tbody is="dmx-repeat" dmx-generator="bs5table" dmx-bind:repeat="serverconnect1.data.query" id="tableRepeat1" dmx-state="query1" dmx-sort="sort" dmx-order="order">
<tr>
<td dmx-text="id"></td>
<td dmx-text="airport"></td>
<td dmx-text="city"></td>
<td dmx-text="country"></td>
</tr>
</tbody>
</table>
I am not sure how did you manage to create this code? Can you share your settings in the UI?