In this case, Asciidoctor is doing what you are asking it to do. The value of the lt attribute is the literal, unencoded left angle bracket. That will indeed break XML. You should either be using the < directly (which Asciidoctor will encode as <) or you can use < (which will be left as is).
In other words, you should only use {lt} if you intend to output a literal < sign...which is for a very special use case.