2

我有这个架构:

<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 选项来检查是否存在,这没有任何区别)

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

有人吗?谢谢。

4

3 回答 3

3

对于复杂的映射,使用自定义 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>
于 2012-09-05T01:16:20.527 回答
2

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

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

于 2014-02-03T23:20:01.963 回答
1
<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>
于 2012-09-04T15:38:02.237 回答