Mapping BizTalk多输入映射存在问题

Mapping BizTalk多输入映射存在问题,mapping,biztalk,Mapping,Biztalk,我有一个包含2条输入消息的映射,如下所示: <ns0:Root> <InputMessagePart_0> <root> <Indicator>1</Indicator> <NewValue>AAA</NewValue> </root> <InputMessagePart_0> <InputMessageP

我有一个包含2条输入消息的映射,如下所示:

<ns0:Root>
   <InputMessagePart_0>
      <root>
         <Indicator>1</Indicator>
         <NewValue>AAA</NewValue>
      </root>
   <InputMessagePart_0>
   <InputMessagePart_1>
      <root>
         <Value>BBB</Value>
      </root>
   <InputMessagePart_1>
</ns0:Root>
<Root>
   <Value>AAA</Value>
</Root>
public string Get_Value(string indicator, string value, string newValue)
{
   if(indicator == "1")
   {
      return newValue;
   }
   else
   {
      return value;
   }
}
由于原始InputMessagePart_1中实际上可能没有出现值,所以我遇到了问题-如果没有,我想创建它。对于上面的脚本,即使指示符是1,当值不存在时,我也不会得到返回字符串

有什么建议吗


更新:我做了一些进一步的测试,删除了if/then逻辑,只是从functoid返回了一个硬编码字符串,我得到了相同的结果。。。似乎只有空输入会破坏functoid的整个功能…

您应该使用functoid并测试值是否为
1
。然后将结果输入两个functoid:

  • 首先,连接到functoid,该functoid连接到源架构第一部分中的
    标记
  • 其次,连接到一个functoid,该functoid随后连接到另一个值映射functoid,该值映射functoid连接到源架构第二部分中的
    标记

如果
;标记不包含预期值
1
,或者源消息中不存在,逻辑相等functoid将返回
False
,并且将执行映射的第二个分支

源模式的第二部分中是否存在
标记并不重要。如果不是,则任何一个值映射functoid都将在目标中创建它


如果您确实需要依赖
标记,则可能需要使用functoid,该functoid返回是否有任何指定的输入节点出现在源消息中。

如果使用映射器所有其他操作都失败,您可以尝试切换到XSLT-查看如何从现有BTM中删除XSLT

您所关注的地图看起来很简单:

<?xml version="1.0" encoding="utf-16"?>
<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > .. etc ... whatever you've scraped out
    <xsl:output ...
    <xsl:template match=...>

<ns1:Root>
<ns1:Value>
    <xsl:choose>
        <xsl:when test="/ns0:Root/ns0:InputMessagePart_0/ns0:root/ns0:Indicator/text()='1'">
            <xsl:value-of select="/ns0:Root/ns0:InputMessagePart_0/ns0:root/ns0:NewValue/text()" />
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="/ns0:Root/ns0:InputMessagePart_1/ns0:root/ns0:Value/text()" />
        </xsl:otherwise>
    </xsl:choose>
<ns1:Value>
</ns1:Root>

.. 等不管你刮掉了什么

要么这不管用,要么我没听懂你的话。。。我将值节点(从InputMessagePart_1)运行到逻辑存在functoid,并将输出运行到值映射functoid。VM的第二个输入是值节点。VM的输出进入if/then脚本functoid(因为我仍然需要查看指示符是1还是0),但结果是一样的-如果值节点不存在,我无法创建它并在指示符=1时用NewValue填充它。否,指示器将始终存在于两个模式的顶部-值在底部模式中是可选的,但我将尝试您建议的方式…我尝试了这个方法,虽然它在简化的测试模式上工作,但当我将其应用于实际情况时失败,可能是因为我正在处理循环HIPAA模式。我已经准备好发布截图了,但是声誉还不够高。。。一旦我将底部值映射连接到目标,我就会丢失它。。。删除连接,它就可以正常工作。不过谢谢,我想我至少朝着更好的方向走了。比尔,至于你原来的问题,我觉得我的答案是正确的。。。并且应该被确定为是这样的。否则,你能用一个更有意义的例子来更新你的问题吗?