O Stephen Thomas tem um excelente post sobre a utilização de xpath para aceder a partes de mensagens em orquestrações, mas há questões que se levantam repetidamente e que talvez não fiquem explícitas naquele texto.
Supondo que temos uma mensagem com um determinado campo que promovemos como Distinguished Field:
– Se tentarmos aceder ao seu valor com "mensagem.campo", e o nó respectivo não existir na mensagem, o valor devolvido é null;
– Se usarmos uma expressão xpath com a função string (ex: xpath(mensagem,"string(/nome/@attribute)");), e o nó respectivo não existir, o valor devolvido é string.empty;
– Só podemos afectar o valor de Distinguished Fields dentro de Construct Shapes;
– Ao fazer a afectação de Distinguished Fields, o nó destino tem de existir na mensagem em causa, ou ocorre uma excepção. Isto sucede quer se se use a sintaxe mensagem.campo = valor; quer usando o xpath().
Este último comportamento pode não ser o esperado, uma vez que a semelhança de sintaxe com o C# faz pensar numa simples afectação de um campo/propriedade de uma classe, mas pode acontecer sempre que o campo afectado não seja obrigatório no schema.
Um "truque" para contornar esta questão pode ser colocar nesses campos valores placeholder/dummy, para que depois as afectações funcionem, ou usando mapas ou aquando da própria instanciação da mensagem.
Nota final: caso não tenha já ficado claro, um Distinguished Field é apenas um alias para um xpath.
[Cross-Posted de http://www.arquitecturadesoftware.org/blogs/joaomartins]