Unfortunately things are not quite this simple. When the browser loads in the template it very helpfully validates the structure of the HTML, notices that you have an invalid tag inside your table definition, and very unhelpfully removes it for you before Aurelia even gets a look-in.

So what is we add containerless to our compose statement? That will remove the ‘compose’ tags! Well, still no good, as the browser has already removed the inner tag.

So, what we want is a way of saying “take this tag, which is valid in this location, but make it act as though it’s a completely different tag”

That’s where the attribute as-element comes in. We can give Aurelia a <tr> tag but tell it to treat its contents as though it were a compose tag!