So, what are the theoretical limits of compositional migration?
I was able to add recursive behavior to XMT and got some basic compositional unit tests cases to work. That was easy enough. I simply passed the node to the MigrationHelper.migrate method instead of the Document object. After migrating all fields in the top level node, I recursively call migrate on all of the non-primitive, non-reference, children elements that are remaining, passing the element node in place of the root node.
The only down side I see right now is that you will always have to traverse the entire document tree. But since you, on average, do very little work during this traversal, I don't think it adding much to the time complexity relative to reading and writing the xml in the first place.
Again, I've only tried a couple happy path unit tests. I wanted to make sure this idea had not already been tried and discarded for reasons I've not yet encountered.