Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Join 如何使用BizTalk mapper将2个不同的重复节点连接到1个重复节点来进行映射_Join_Mapping_Nodes_Biztalk_Repeat - Fatal编程技术网

Join 如何使用BizTalk mapper将2个不同的重复节点连接到1个重复节点来进行映射

Join 如何使用BizTalk mapper将2个不同的重复节点连接到1个重复节点来进行映射,join,mapping,nodes,biztalk,repeat,Join,Mapping,Nodes,Biztalk,Repeat,问题是我需要在重复节点上循环,但也需要从基于LineId匹配的同级重复节点提取信息。如果这是一个数据库,我会将每个重复节点等同于一个表,并希望根据匹配的ID输出两个表的连接 我一开始是在Root/shippings/shipping/Containers/Container上循环到Document/Header/Detail,这似乎是可行的,因为我想为源中的每个容器创建一条记录,作为目标中的一条细节记录。但是,当我从Root/shippings/shipping/Details/Details映

问题是我需要在重复节点上循环,但也需要从基于LineId匹配的同级重复节点提取信息。如果这是一个数据库,我会将每个重复节点等同于一个表,并希望根据匹配的ID输出两个表的连接

我一开始是在Root/shippings/shipping/Containers/Container上循环到Document/Header/Detail,这似乎是可行的,因为我想为源中的每个容器创建一条记录,作为目标中的一条细节记录。但是,当我从Root/shippings/shipping/Details/Details映射字段时,我只从映射的第一条记录而不是具有匹配LineId的记录中获取数据。然后,我尝试将Root/shippings/shipping/Details/Details添加到循环中,并有条件地抑制节点之间LineId不匹配但不起作用的文档/细节。所以,我尝试使用相同的抑制条件在细节上添加第二个循环,但也不起作用。然后,我想我会尝试使用XSLT模板根据LineId作为输入来“查找”根/shippings/shipping/Details/Details中的数据,但它从未返回任何数据(它总是空的)。此外,要在字段级别分别获取每个字段,我需要搜索X次,每个字段搜索1次,而不是每个记录搜索1次,因此这似乎也是低效的

我的XSLT知识有限。如果可能,我更愿意使用脚本functoid的映射,而不是纯XSLT。性能也是一个问题,因为在这个项目中我需要做的文件数量非常多。我在下面给出的示例是我需要对几十个字段执行的一个非常精简的版本,并且源文件在层次结构中有更多的层

实现我需要做的事情的最佳方式是什么

源文件:

<Root>
  <Shipments>
    <Shipment>
      <ShipId>1</ShipId>
      <Details>
        <Detail>
          <LineId>1</LineId>
          <RequestedQty>10</RequestedQty>
          <Sku>347</Sku>
          <Status>C</Status>
        </Detail>
        <Detail>
          <LineId>2</LineId>
          <RequestedQty>5</RequestedQty>
          <Sku>125</Sku>
          <Status>P</Status>
        </Detail>
        <Detail>
          <LineId>3</LineId>
          <RequestedQty>8</RequestedQty>
          <Sku>337</Sku>
          <Status>O</Status>
        </Detail>
        <Detail>
          <LineId>4</LineId>
          <RequestedQty>12</RequestedQty>
          <Sku>7438</Sku>
          <Status>C</Status>
        </Detail>
      </Details>
      <Containers>
        <Container>
          <ContainerId>1</ContainerId>
          <Details>
            <Detail>
              <LineId>1</LineId>
              <Lot>103</Lot>
              <ShipQty>10</ShipQty>
            </Detail>
            <Detail>
              <LineId>2</LineId>
              <Lot>102</Lot>
              <ShipQty>3</ShipQty>
            </Detail>
          </Details>
          <TrackingNUmber>Z934793498923984</TrackingNUmber>
        </Container>
        <Container>
          <ContainerId>2</ContainerId>
          <Details>
            <Detail>
              <LineId>4</LineId>
              <Lot>101</Lot>
              <ShipQty>10</ShipQty>
            </Detail>
            <Detail>
              <LineId>4</LineId>
              <Lot>105</Lot>
              <ShipQty>2</ShipQty>
            </Detail>
          </Detail>
        </Details>
        <TrackingNUmber>Z531365161663161</TrackingNUmber>
      </Container>
    </Containers>
  </Shipment>
</Shipments>
</Root>

1.
1.
10
347
C
2.
5.
125
P
3.
8.
337
O
4.
12
7438
C
1.
1.
103
10
2.
102
3.
Z934793498923984
2.
4.
101
10
4.
105
2.
Z531365161663161
进入:


1.
1.
1.
103
10
10
347
C
Z934793498923984
1.
2.
102
3.
5.
125
P
Z934793498923984
2.
4.
101
10
12
7438
C
Z531365161663161
2.
4.
105
2.
12
7438
C
Z531365161663161

我不确定这是不是最好的解决方案,但我有一些东西可能会让你走。其思想是使用脚本functoid在目标文档中创建Detail元素

鉴于您有很多元素,我建议您使用以下方法来正确命名:

  • 使用要显示在目标详图元素中的所有元素创建直接链接。

  • “验证映射”以获取xslt。复制详图元素及其内容

  • 删除到详图图元的所有直接链接

  • 在源容器/详细信息/详细信息和目标详细信息之间添加循环functoid

  • 添加脚本functoid,将其连接到目标详细信息。选择内联XSLT并粘贴在步骤2中复制的代码

  • 测试地图,以验证其大部分工作正常(尽管装运/详细信息/详细信息仍将是错误的)

  • 在脚本functoid中修改xslt。您需要一个变量来指向与当前行对应的shipping/Details/Details元素

  • 根据当前LineId设置变量:

    <xsl:variable name="CurrentShipmentDetail" select="../../../../Details/Detail[LineId=current()/LineId]"/>
    
    <RequestedQty>
        <xsl:value-of select="$CurrentShipmentDetail/RequestedQty/text()" />
    </RequestedQty>
    
    <Detail>
      <ContainerId>
        <xsl:value-of select="../../ContainerId/text()" />
      </ContainerId>
      <LineId>
        <xsl:value-of select="LineId/text()" />
      </LineId>
      <Lot>
        <xsl:value-of select="Lot/text()" />
      </Lot>
      <ShipQty>
        <xsl:value-of select="ShipQty/text()" />
      </ShipQty>
    
      <xsl:variable name="CurrentShipmentDetail" select="../../../../Details/Detail[LineId=current()/LineId]"/>
      <RequestedQty>
        <xsl:value-of select="$CurrentShipmentDetail/RequestedQty/text()" />
      </RequestedQty>
      <Sku>
        <xsl:value-of select="$CurrentShipmentDetail/Sku/text()" />
      </Sku>
      <Status>
        <xsl:value-of select="$CurrentShipmentDetail/Status/text()" />
      </Status>
      <TrackingNUmber>
        <xsl:value-of select="../../TrackingNUmber/text()" />
      </TrackingNUmber>
    </Detail>
    
    
    
  • 修改元素,以便从变量中进行选择
  • 之前:

    <RequestedQty>
        <xsl:value-of select="../../../../Details/Detail/RequestedQty/text()" />
    </RequestedQty> 
    
    
    
    之后:

    <xsl:variable name="CurrentShipmentDetail" select="../../../../Details/Detail[LineId=current()/LineId]"/>
    
    <RequestedQty>
        <xsl:value-of select="$CurrentShipmentDetail/RequestedQty/text()" />
    </RequestedQty>
    
    <Detail>
      <ContainerId>
        <xsl:value-of select="../../ContainerId/text()" />
      </ContainerId>
      <LineId>
        <xsl:value-of select="LineId/text()" />
      </LineId>
      <Lot>
        <xsl:value-of select="Lot/text()" />
      </Lot>
      <ShipQty>
        <xsl:value-of select="ShipQty/text()" />
      </ShipQty>
    
      <xsl:variable name="CurrentShipmentDetail" select="../../../../Details/Detail[LineId=current()/LineId]"/>
      <RequestedQty>
        <xsl:value-of select="$CurrentShipmentDetail/RequestedQty/text()" />
      </RequestedQty>
      <Sku>
        <xsl:value-of select="$CurrentShipmentDetail/Sku/text()" />
      </Sku>
      <Status>
        <xsl:value-of select="$CurrentShipmentDetail/Status/text()" />
      </Status>
      <TrackingNUmber>
        <xsl:value-of select="../../TrackingNUmber/text()" />
      </TrackingNUmber>
    </Detail>
    
    
    
    完整地图:

    <xsl:variable name="CurrentShipmentDetail" select="../../../../Details/Detail[LineId=current()/LineId]"/>
    
    <RequestedQty>
        <xsl:value-of select="$CurrentShipmentDetail/RequestedQty/text()" />
    </RequestedQty>
    
    <Detail>
      <ContainerId>
        <xsl:value-of select="../../ContainerId/text()" />
      </ContainerId>
      <LineId>
        <xsl:value-of select="LineId/text()" />
      </LineId>
      <Lot>
        <xsl:value-of select="Lot/text()" />
      </Lot>
      <ShipQty>
        <xsl:value-of select="ShipQty/text()" />
      </ShipQty>
    
      <xsl:variable name="CurrentShipmentDetail" select="../../../../Details/Detail[LineId=current()/LineId]"/>
      <RequestedQty>
        <xsl:value-of select="$CurrentShipmentDetail/RequestedQty/text()" />
      </RequestedQty>
      <Sku>
        <xsl:value-of select="$CurrentShipmentDetail/Sku/text()" />
      </Sku>
      <Status>
        <xsl:value-of select="$CurrentShipmentDetail/Status/text()" />
      </Status>
      <TrackingNUmber>
        <xsl:value-of select="../../TrackingNUmber/text()" />
      </TrackingNUmber>
    </Detail>
    

    和完整的xslt代码:

    <xsl:variable name="CurrentShipmentDetail" select="../../../../Details/Detail[LineId=current()/LineId]"/>
    
    <RequestedQty>
        <xsl:value-of select="$CurrentShipmentDetail/RequestedQty/text()" />
    </RequestedQty>
    
    <Detail>
      <ContainerId>
        <xsl:value-of select="../../ContainerId/text()" />
      </ContainerId>
      <LineId>
        <xsl:value-of select="LineId/text()" />
      </LineId>
      <Lot>
        <xsl:value-of select="Lot/text()" />
      </Lot>
      <ShipQty>
        <xsl:value-of select="ShipQty/text()" />
      </ShipQty>
    
      <xsl:variable name="CurrentShipmentDetail" select="../../../../Details/Detail[LineId=current()/LineId]"/>
      <RequestedQty>
        <xsl:value-of select="$CurrentShipmentDetail/RequestedQty/text()" />
      </RequestedQty>
      <Sku>
        <xsl:value-of select="$CurrentShipmentDetail/Sku/text()" />
      </Sku>
      <Status>
        <xsl:value-of select="$CurrentShipmentDetail/Status/text()" />
      </Status>
      <TrackingNUmber>
        <xsl:value-of select="../../TrackingNUmber/text()" />
      </TrackingNUmber>
    </Detail>
    

    您应该能够通过循环和相等Functoid来实现这一点

    将装运/详细信息连接到循环Functoid,然后将容器/详细信息连接到同一循环Functoid

    然后将Shipping//LineId和Container//LinId连接到相等的Functoid,然后将相等的Functoid连接到目标详细信息


    您将看到映射器如何在xsl中构建循环和条件。您可以从那里进行调整。

    稍等!为了澄清,您需要按LindId合并详细记录?是,按LineId合并。我想“加入”数据。这看起来可能真的有效。我想我需要更好地处理XSLT。我喜欢您使用GUI创建初始脚本。你的方法给了我一个主意。我是否可以编写一个脚本来查找详细记录并将其保存到变量中,然后对每个字段使用其他脚本,这些脚本将使用从第一个脚本保存的变量提取我想要的字段?这样,我仍然可以在容器上使用GUI并直接链接它们,而无需借助XSLT来获取容器中的数据。如果不将XSLT脚本绑定到节点,则无法创建XSLT脚本,一旦创建了XSLT脚本,mapper将不允许将字段链接到该节点或其任何子节点。糟糕的是,如果不将XSLT脚本链接到目标节点,就无法插入XSLT脚本。大卫的建议很管用。这是我的建议