【问题标题】:Biztalk Map three parent nodes to single none repeating nodeBiztalk 将三个父节点映射到单个无重复节点
【发布时间】:2016-06-26 08:59:37
【问题描述】:

我有一个输入模式 (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,但我的问题是如何最好地将这个结构映射到相关的输出模式节点(这些节点最多出现 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 以进行数据确认。这似乎导致重复节点。

【问题讨论】:

    标签: biztalk biztalk-2013 biztalk-mapper


    【解决方案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 方法。

    【讨论】:

    • 感谢您的回复。你能解释一下 test= position() < 4. 地图主要完成了functoids、脚本节点等。这是我们需要迎合的小更新,因此在地图中寻找解决方案。
    • 这是仅迭代前 3 个联系人,据我所知,这是要求之一。 ' 输出 xslt)。所以事实上,在我看来,这是一个有效的答案。由您决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    相关资源
    最近更新 更多