【问题标题】:How to map 2 different nodes into a repeating node using BizTalk mapper如何使用 BizTalk 映射器将 2 个不同的节点映射到一个重复节点
【发布时间】:2012-09-04 15:07:57
【问题描述】:

我有这个架构:

<Root>
  <Customers>
    <Customer>
      <ID>123</ID>
      <Name>John</Name>
    </Customer>
  </Customers>
  <Order>
    <ID>ABC</ID>
    <Title>Boat</Title>
  </Order>
</Root>

我需要将两条不同的记录映射成一个重复记录,如下所示:

<Root>
  <Data>
    <ID>123</ID>
    <Text>John</Text>
  </Data>
  <Data>
    <ID>ABC</ID>
    <Text>Boat</Text>
  </Data>
</Root>

我尝试创建两个表循环(一个用于客户,一个用于订单)并得到:

<Root>
  <Data>
    <ID>ABC</ID>
    <Text>Boat</Text>
  </Data>
</Root>

尝试了一个包含两行的表循环,结果相同。 (也尝试使用 Gated 选项来检查是否存在,这没有任何区别)

实际上,架构很大,地图超级复杂(不是我建的),有很多 functoid 和很多连线。所以我想避免创建一个自定义的 XSL,这对于这项任务来说会更容易,但更难维护。这是我唯一需要更改的部分。

有人吗? 谢谢。

【问题讨论】:

    标签: xslt biztalk biztalk-2010 biztalk-mapper


    【解决方案1】:

    对于复杂的映射,使用自定义 XSLT 几乎总是比我们经常在 BizTalk 映射中找到的蜘蛛网更简单且更易于维护。但是,正如您所说,您需要避免重新编码整个地图,因为您只更改了一小部分。

    您应该能够在 Scripting Functoid 中使用“内联 XSLT 调用模板”脚本类型来结合最好的 BizTalk 映射和自定义 XSLT。

    根据 Sean B. Durkin 的回答,您需要设置 2 个调用模板 functoid,第一个连接到您的输出“数据”节点

    <xsl:template name="DataTemplate">
        <xsl:apply-templates select="//*[local-name()='Customer']|//*[local-name()='Order']" />
    </xsl:template>
    

    您的第二个调用模板会将相关数据输出到当前输出的“数据”节点中。请注意,第二个 Functoid 不需要连接到输出文档中的任何节点。

    <xsl:template match="*[local-name()='Customer']|*[local-name()='Order']">
        <xsl:element name="Data">
          <xsl:element name="ID">
              <xsl:value-of select="*[local-name()='ID']"/>
          </xsl:element>
          <xsl:element name="Text">
              <xsl:value-of select="*[local-name()='Name']|*[local-name()='Title']" />
          </xsl:element>
        </xsl:element>
    </xsl:template>
    

    【讨论】:

    • 大家好,感谢您的快速回复,肖恩,如果我使用自定义 XSL 选项,您的解决方案看起来很棒,但还没有尝试过。 Brett,我试过了,将两个脚本 functoid 连接到 Data 节点,但得到以下输出:125Name_0ID_0 Title_0 似乎它已经到了那里。尝试更多地使用此解决方案。如果我能解决这个问题会更新。有什么建议么 ?再次感谢。
    • 我已根据您的反馈更新了我的答案。此外,您只想将第一个调用模板 functoid 连接到输出文档模式,第二个只是位于设计表面上,未连接,但仍会自动被第一个 functoid 调用。
    • 感谢您的快速回答 :) 得到了我所需要的。现在只需要把它应用到真实的东西上......祝我好运。再次欢呼。
    【解决方案2】:

    这里不需要使用 XSLT。只需在地图上拖动一个 Looping functoid。将 Customer 和 Order 记录作为输入连接到 functoid(是的,您可以有多个输入)。将 functoid 的输出连接到数据记录。然后直接连接您的字段(ID --> ID,名称 --> 文本)。这将起作用。

    循环 functoid 的各个输入记录本身不必重复记录。通过将多个输入连接到 functoid,您可以遍历实例集合。

    【讨论】:

    【解决方案3】:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    
    <xsl:template match="/">
     <Root>
       <xsl:apply-templates select="*/Customers/Customer|*/Order"/>
     </Root>
    </xsl:template>
    
    <xsl:template match="Customer|Order">
     <Data>
       <ID><xsl:value-of select="ID" /></ID>
       <Text><xsl:value-of select="Name|Title" /></Text>
     </Data>
    </xsl:template>
    
    </xsl:stylesheet>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多