Biztalk 将三个父节点映射到单个 none 重复节点

Biztalk Map three parent nodes to single none repeating node

我有这样的输入架构 (input_schema):

    ...
<ContactNo>
    <Contact_1>
        <Contact-Type>MOBILE|HOME|WORK</Contact-Type>
        <Contact-SubType>UK|OVERSEAS</Contact-SubType>
        <Contact-CountyCode>44</Contact-CountyCode>
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex>85000</Contact-Ex>
    </Contact_1>
    <Contact_2>
        <Contact-Type>MOBILE|HOME|WORK</Contact-Type>
        <Contact-SubType>UK|OVERSEAS</Contact-SubType>
        <Contact-CountyCode>44</Contact-CountyCode>
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex>85000</Contact-Ex>
    </Contact_2>
    <Contact_3>
        <Contact-Type>MOBILE|HOME|WORK</Contact-Type>
        <Contact-SubType>UK|OVERSEAS</Contact-SubType>
        <Contact-CountyCode>44</Contact-CountyCode>
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex>85000</Contact-Ex>
    </Contact_3>
    ...
</ContactNo>
...

ContactNo 的每个子节点只能出现一次(一个Contact_1、一个Contact_2 和一个Contact_3)。我需要为 Contact-Type、SubType 应用一些业务逻辑来构造 Contact-No,但我的问题是如何最好地将此结构映射到相关的 out_put 模式节点(这些节点最多出现 20 ) 但最多只能有三个,基于下面的 input_schema 模式结构:

...
<HomeTelephone>
<WorkTelephone>
<MobileTelephone>
...

样本Input/Output

...
<ContactNo>
    <Contact_1>
        <Contact-Type>HOME</Contact-Type>
        <Contact-SubType>UK</Contact-SubType>
        <Contact-CountyCode />
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex/>
    </Contact_1>
    <Contact_2>
        <Contact-Type>WORK</Contact-Type>
        <Contact-SubType />
        <Contact-CountyCode />
        <Contact-No>01743788800</Contact-No>
        <Contact-Ex>86000</Contact-Ex>
    </Contact_2>
    <Contact_3>
        <Contact-Type>WORK</Contact-Type>
        <Contact-SubType>UK</Contact-SubType>
        <Contact-CountyCode />
        <Contact-No>01443788800</Contact-No>
        <Contact-Ex>85000</Contact-Ex>
    </Contact_3>
    ...
</ContactNo>
...

...
<HomeTelephone>01443788800</HomeTelephone>
<WorkTelephone>0174378880086000</WorkTelephone>
<WorkTelephone>0144378880085000</WorkTelephone>
<MobileTelephone />
...

目前我正在检查 Contact-Type (=Home),然后通过值映射器将输出映射到脚本 functoid,以便在映射输出之前进行数据确认。这似乎导致重复节点。

您是否考虑过在映射中使用 XSLT?不仅比 BizTalk 映射器更易于使用,而且更灵活且使用更广泛(您可以在许多产品中原生使用 XSLT)。

适当的 XSLT 会产生如下内容:

<xsl:for-each select="ContactNo/*">
  <xsl:if test="position() &lt; 4">
    <xsl:choose>
      <xsl:when test="Contact-Type/text() = 'WORK'">
        <WorkTelephone>
          <xsl:value-of select="Contact-No/text()" />
        </WorkTelephone>
      </xsl:when>
      <xsl:when test="Contact-Type/text() = 'HOME'">
        <HomeTelephone>
          <xsl:value-of select="Contact-No/text()" />
        </HomeTelephone>
      </xsl:when>
      <xsl:when test="Contact-Type/text() = 'MOBILE'">
        <MobileTelephone>
          <xsl:value-of select="Contact-No/text()" />
        </MobileTelephone>
      </xsl:when>
    </xsl:choose>
  </xsl:if>
</xsl:for-each>

这应该遍历前 3 个联系人并相应地列出它们。

如果这符合您的需要,请告诉我。

免责声明:由于时间关系还没有测试,谨防语法和打字错误。我也知道你在要求映射器,我只是确信映射器完全不如原生 xslt 方法。