Em transformações de modelo em modelo, é possível especificar somente um tipo de saída por declaração de mapeamento. Como resultado, ao gerar uma transformação a partir de uma declaração de mapeamento e executá-la, todos os objetos de saída são do tipo especificado.
É possível usar mapeamentos de submapa dentro da declaração de mapeamento para gerar extratores que preenchem recursos de um objeto de saída. Porém, antes de poder criar um mapeamento de submapa, o recurso que você deseja extrair para preencher deve estar visível no tipo de saída da declaração de mapeamento.
Se o recurso necessário não estiver visível, a solução é usar um elemento inteiro, em vez de um recurso de um elemento, como o objeto de entrada para mapeamento de submapa.
Quando um recurso de um elemento é o objeto de entrada para o mapeamanto de submapa, como normalmente é o caso, o conteúdo do recurso é extraído e passado para a transformação do submapa. Porém, quando um elemento é um objeto de entrada para mapeamento de submapa, a transformação passa uma instância do elemento completo, incluindo todos os seus recursos. Como resultado, no código de origem da transformação gerada, todos os recursos estão disponíveis para transformações subsequentes.
Essa abordagem é útil quando o esquema de mapeamento disponível não pode fornecer submapas dentro do contexto de uma única declaração de mapeamento para todos os objetos que você deseja gerar a partir de um elemento de entrada da declaração de mapeamento. É possível usar essa técnica para definir mais do que uma declaração de mapeamento, para que mais de uma transformação esteja disponível para processar o mesmo objeto de entrada.
Os tipos de saídas, com os tipos de entradas, são organizados em hierarquias de tipos. Descendentes de um tipo estendem a definição de tipo do ancestral por meio da inclusão de novos recursos no tipo do ancestral. Para suportar polimorfismo, os recursos geralmente são de tipos que não estão incluídos na hierarquia de tipo.
Por exemplo, um recurso pode ser do tipo "Classificador" em vez de "Classe" ou "Interface." No editor de mapeamento, você poderia expandir o recurso do tipo "Classificador" e ver os recursos que um "Classificador" possui. Mas você não poderia ver os recursos que uma "Classe" ou "Interface" possui que um "Classificador" não possui. Essa falta de visibilidade significa que não é possível criar diretamente um mapeamento para esses recursos incluídos.
A solução apresentada anteriormente tem a vantagem de não solicitar que você escreva código Java™. Duas soluções alternativas, que necessitam de código Java customizado, estão disponíveis, e podem oferecer uma solução mais simples e com maior capacidade de manutenção, ou mais flexível sob certas circunstâncias: