0

2 年前我曾问过这个问题(BizTalk 多输入地图问题),但随后该项目被搁置,我从未进行任何进一步的测试。我不得不再次对其进行除尘,并提供更多详细信息和屏幕截图。

我有一个 BizTalk HIPAA 解决方案,需要将 837 声明架构与我们系统中的一些数据合并。我们使用具有两个输入模式的映射来执行此操作,如下所示:

在此处输入图像描述

(出于测试目的,我已经大大简化了模式)。对我的原始帖子的接受答案(使用相等的 functoid 和值映射器)适用于我最初展示的简单模式,但在实际 EDI 模式中失败。

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

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

那么,有没有办法使用 functoids 来做到这一点,还是我需要求助于 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>
4

1 回答 1

2

我经常用地图中的 if missing-else 范式碰壁。有时 Looping Functioids 可以解决问题,有时则不行。有时精心放置的逻辑存在 -> 无效,有时无效。

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

我会说 >50%,我求助于内联 Xslt,因为在某些时候,它变得比大部分重复 Functoid 组的页面更干净。

但是,我敢打赌 Xslt 不会像您想象的那样困难。Mapper 可以为您完成大部分工作。您可以使用 Functoids 构建大部分 Map,然后只需复制生成的 Xslt。你将不得不修改一些东西,比如命名空间。

(同样的答案)

于 2013-12-17T18:36:19.190 回答