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

时间:2016-03-11 07:40:29

标签: biztalk biztalk-2013 biztalk-mapper

我有一个输入模式(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>
...

示例输入/输出

...
<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,以便在映射输出之前进行数据确认。这似乎导致重复的节点。

1 个答案:

答案 0 :(得分:1)

您是否考虑在映射中使用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方法。