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

Biztalk将三个父节点映射到单个无重复节点,biztalk,biztalk-2013,biztalk-mapper,Biztalk,Biztalk 2013,Biztalk Mapper,我有一个输入模式(输入模式): 。。。 移动|家庭|工作 英国|海外 44 01443788800 85000 移动|家庭|工作 英国|海外 44 01443788800 85000 移动|家庭|工作 英国|海外 44 01443788800 85000 ... ... ContactNo的每个子节点只能出现一次(一个触点_1、一个触点_2和一个触点_3)。我需要为联系人类型、子类型应用一些业务逻辑来构造联系人编号,但我的问题是,您如何最好地将此结构映射到相关的输出模式节点(这些节点最多为20

我有一个输入模式(输入模式):

。。。
移动|家庭|工作
英国|海外
44
01443788800
85000
移动|家庭|工作
英国|海外
44
01443788800
85000
移动|家庭|工作
英国|海外
44
01443788800
85000
...
...
ContactNo的每个子节点只能出现一次(一个触点_1、一个触点_2和一个触点_3)。我需要为联系人类型、子类型应用一些业务逻辑来构造联系人编号,但我的问题是,您如何最好地将此结构映射到相关的输出模式节点(这些节点最多为20个),但根据下面的输入模式结构,最多只能有三个:

...
<HomeTelephone>
<WorkTelephone>
<MobileTelephone>
...
。。。
...
样本输入/输出

...
<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 />
...
。。。
家
英国
01443788800
工作
01743788800
86000
工作
英国
01443788800
85000
...
...
...
01443788800
0174378880086000
0144378880085000
...

目前,我正在检查联系人类型(=主页),然后通过值映射器将输出映射到脚本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方法。

感谢您的回复。你能解释一下test=position()的用法吗。地图主要是通过functoid、脚本节点等完成的。这是一个小的更新,我们需要满足,因此我们正在地图中寻找解决方案。这只是迭代前3个联系人,这是我所能看到的要求之一。这个
<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>