Pergunta

Estou mapeando para uma mensagem HL7 A31 usando o mapeador BizTalk. O mapa tem vários functoids de script XSLT embutidos.

Quando o XML é colocado no pipeline de envio HL7, ele gera um erro:

O elemento 'ROL_11_OfficeHomeAddress' tem uma estrutura inválida

Se eu olhar a mensagem suspensa, posso ver por que isso aconteceu. O elemento ROL_11 está vazio e tem a seguinte aparência:

    <ROL_11_OfficeHomeAddress>
    </ROL_11_OfficeHomeAddress>

Entre as tags de abertura e fechamento, há uma quebra de linha e vários espaços / tabulações devido ao recuo. Isso é exatamente como gerado pelo XSLT e acredito que seja a quebra de linha que está causando o erro.

Eu poderia envolver o XSLT em uma instrução <xsl:if> para verificar se há um valor antes de escrever o XML. No entanto, esse problema está ocorrendo em muitos lugares e parece um exagero envolver cada elemento dessa forma.

O que eu realmente quero é que o BizTalk converta automaticamente o elemento em um vazio, como este:

<ROL_11_OfficeHomeAddress />

Acredito que isso resolveria o problema. Existe alguma maneira de eu dizer para fazer isso?

Coisas que já tentei:

  • Usando <xsl:strip-space>, mas isso gerou seu próprio erro. Acho que isso ocorre porque o BizTalk envolve o XSLT embutido em seu próprio código e, portanto, o strip-space foi especificado no lugar errado.

  • Alterar as propriedades da grade do mapa para definir Recuar como Não na esperança de que o espaço em branco seja removido. Isso não afetou o XML visto na mensagem suspensa.

  • Adicionando a chave de registro para manipulação de espaço em branco legado de acordo com esta orientação . Novamente, isso pareceu não surtir nenhum efeito.

Foi útil?

Solução

Se você converter seu mapa inteiro em XSLT , o seguinte removerá novas linhas e espaços em branco e deixará você com uma tag vazia se não houver nada além de espaços em branco:

<xsl:element name="ROL_11_OfficeHomeAddress">
  <xsl:if test="normalize-space(ROL_11_OfficeHomeAddress)">
    <xsl:value-of select="normalize-space(ROL_11_OfficeHomeAddress)" />
  </xsl:if>
</xsl:element>

Editar : Biztalk geralmente gera XSLT como o seguinte em um mapeamento de elemento nillable 1: 1 típico

    <xsl:variable name="var:v2" select="string(ns0:ROL_11_OfficeHomeAddress/@xsi:nil) = 'true'" />
    <xsl:if test="string($var:v2)='true'">
      <ns0:ROL_11_OfficeHomeAddress>
        <xsl:attribute name="xsi:nil">
          <xsl:value-of select="'true'" />
        </xsl:attribute>
      </ns0:ROL_11_OfficeHomeAddress>
    </xsl:if>
    <xsl:if test="string($var:v2)='false'">
      <ns0:ROL_11_OfficeHomeAddress>
        <xsl:value-of select="ROL_11_OfficeHomeAddress/text()" />
      </ns0:ROL_11_OfficeHomeAddress>
    </xsl:if>

Portanto, se você usou <xsl:strip-space>, isso significaria que o elemento seria mapeado para <ROL_11_OfficeHomeAddress></ROL_11_OfficeHomeAddress> apenas com espaços em branco, a menos que você tenha passado pelo mapa alterando-o de volta para <xsl:element>.

O que você pode tentar é usar um modelo de chamada como o abaixo (nodeXfrm é um nó)

<xsl:template name="StripElement">
    <xsl:param name="nodeXfrm"></xsl:param>
    <xsl:variable name="nodeName">
        <xsl:value-of select="local-name($nodeXfrm)"></xsl:value-of>
    </xsl:variable>
    <xsl:element name="{$nodeName}">
        <xsl:if test="normalize-space($nodeXfrm)!=''">
            <xsl:value-of select="$nodeXfrm/text()"/>
        </xsl:if>
    </xsl:element>
</xsl:template>

E então, dentro do seu mapa, você pode chamar o modelo para cada elemento que precisa ser removido desta forma

  <xsl:call-template name="StripElement">
    <xsl:with-param name="nodeXfrm" select="ROL_11_OfficeHomeAddress"></xsl:with-param>
  </xsl:call-template>

Um guru XSLT pode ser capaz de fazer isso com mais elegância

Outras dicas

Eu também tive esse problema recentemente, mas no BizTalk 2013. Mudamos tudo para arquivos XSLT personalizados para mapear nosso HL7v2.Após a atualização para 2013, de repente, o <xsl:strip-space> que funcionava anteriormente, não funcionou mais.

Isso ocorre porque o BizTalk 2013 agora usa a classe XslCompiledTransform em vez da agora obsoleta classe XslTransform e não permite o <xsl:strip-space>.Portanto, eu também não encontrei uma maneira global de eliminar o espaço em branco.

No entanto, depois de muito pesquisar e coçar a cabeça, encontrei uma postagem de blog obscura com algo que funcionou para minha solução:

http://geekswithblogs.net/peterbrouwer / archive / 2012/08/17 / biztalk-2010ndashlegacy-whitespace-behaviour.aspx

Uma opção nas configurações do Host, para usar espaços em branco legados, fez isso por nós (pelo menos até agora).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top