BizTalk HIPAA EDI多输入映射不生成节点

时间:2013-12-17 17:12:39

标签: biztalk edi biztalk-mapper

2年前我曾问过这个问题(Problem with BizTalk multi-input map),但随后该项目被搁置,我从未做过任何进一步的测试。我不得不再次把它弄脏,还有一些细节和截图。

我有一个BizTalk HIPAA解决方案,需要将837声明架构与我们系统中的一些数据合并。我们用一个有两个输入模式的地图来做这个,如下所示:

enter image description here

(我为测试目的大大简化了模式)。 我原来的帖子(使用相同的functoid和值映射器)接受的答案可以很好地使用我最初显示的简单模式,但是在实际的EDI模式中失败了。

在第一个输入消息中,如果IsRepriced = 1,我想将我们的值用于HCP_01,HCP_02和HCP_03。如果为0,则使用第二条消息中的值(原始837索赔)。只要原始的837声明实际上包含HCP节点(段),所示的functoid就可以正常工作,但如果它不存在,我就无法从我们的数据中生成一个。

使用一些if-then-else C#代码替换脚本functoid具有相同的效果。

那么,有没有办法使用functoid来做到这一点,还是我需要求助于XSLT?不幸的是,我对XSLT几乎一无所知,所以这很难......

谢谢!

编辑:我想使用内联XSLT调用模板,使用以下代码:

<xsl:template name="Repricing_2000B_HCP">
<xsl:param name="IsRepriced" />
<xsl:choose>
  <xsl:when test="$IsRepriced='1'">
<xsl:for-each select="//InputMessagePart_1/ns0:X12_00401_837_I/ns0:TS837Q3_2000A_Loop/ns0:TS837Q3_2000B_Loop/ns0:TS837Q3_2300_Loop/ns0:HCP_ClaimPricingRepricingInformation_TS837Q3_2300">
<xsl:element name="ns0:HCP_ClaimPricingRepricingInformation_TS837Q3_2300">
    <xsl:copy-of select="./@*" /> 
    <xsl:copy-of select="./*" /> 
</xsl:element>
</xsl:for-each>
  </xsl:when>
  <xsl:otherwise>
<xsl:for-each select="//InputMessagePart_0/ns0:X12_00401_837_I/ns0:TS837Q3_2000A_Loop/ns0:TS837Q3_2000B_Loop/ns0:TS837Q3_2300_Loop/ns0:HCP_ClaimPricingRepricingInformation_TS837Q3_2300">
<xsl:element name="ns0:HCP_ClaimPricingRepricingInformation_TS837Q3_2300">
    <xsl:copy-of select="./@*" /> 
    <xsl:copy-of select="./*" /> 
</xsl:element>
  </xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

1 个答案:

答案 0 :(得分:2)

我经常在地图上撞到一块砖墙。有时循环功能可以做到这一点,有时候不行。有时精心放置的逻辑存在 - &gt;不行,有时没有。

主要是因为如果其中一个源记录是minOccurs = 0,则Mapper会将所有内容包装在for-each中。由于元素不存在,代码永远不会被执行。

我会说&gt; 50%,我使用内联Xslt,因为在某些时候,它变得比一个大多数重复的Functoid组的页面更清晰。

但是,我敢打赌,Xslt不会像你想象的那样难以成为一个命题。 Mapper可以为您完成大部分工作。您可以使用Functoid构建大量Map,然后只复制生成的Xslt。您将不得不修改某些内容,例如命名空间。

(同样的答案)