将相关的重复节点映射到BizTalk Mapper上的重复节点

时间:2014-01-28 14:35:42

标签: biztalk biztalk-mapper

我正在尝试在BizTalk 2013上做一个地图,我在这个映射问题上被阻止了(使用mapper):

输入消息:

<DetailsResponse>
    <HeaderDetails>
        <DocumentNumber>322</DocumentNumber>
    </HeaderDetails>
    <ItemDetails>
        <item>
            <DocumentNumber>322</DocumentNumber>
            <ItemNumber>1</ItemNumber>
            <MaterialNumber>40</MaterialNumber>
            <Description>random description 1</Description>
        </item>
        <item>
            <DocumentNumber>322</DocumentNumber>
            <ItemNumber>2</ItemNumber>
            <MaterialNumber>41</MaterialNumber>
            <Description>random description 2</Description>
        </item>
    </ItemDetails>
    <ScheduleDetails>
        <item>
            <DocumentNumber>322</DocumentNumber>
            <ItemNumber>1</ItemNumber>
            <ConfirmedQuantity>2.000</ConfirmedQuantity>
        </item>
        <item>
            <DocumentNumber>322</DocumentNumber>
            <ItemNumber>2</ItemNumber>
            <ConfirmedQuantity>3.000</ConfirmedQuantity>
        </item>
    </ScheduleDetails>
</DetailsResponse>

目标输出消息:

<Response>
    <Data>
        <Items>
            <Item>
                <LineNumber>
                    <Internal>1</Internal>
                </LineNumber>
                <ConfirmedQuantity>
                    <Value>2</Value>
                </ConfirmedQuantity>
                <Article>
                    <Number>40</Number>
                    <Description>random description 1</Description>
                </Article>
            </Item>
            <Item>
                <LineNumber>
                    <Internal>2</Internal>
                </LineNumber>
                <ConfirmedQuantity>
                    <Value>3</Value>
                </ConfirmedQuantity>
                <Article>
                    <Number>41</Number>
                    <Description>random description 2</Description>
                </Article>
            </Item>
        </Items>
    </Data>
</Response>

我希望通过基于ItemsDetails“合并”他们的数据,将ScheduleDetailsItem映射到ItemNumber。我已经尝试了很多东西,但还没能做到。

我找不到任何关于此的例子。这种模式有什么特别的名字吗?

如果有人知道他们可以分享,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

我可以想到使用Functoid的唯一方法是将ItemDetails和ScheduleDetails与一个或多个循环Functoid链接,并使用Equal Functoid根据当前的ItemDetail ItemNumber过滤ScheduleDetails。

它没有用,你唯一的另一个选择是自定义Xslt。呼叫模板非常简单。

答案 1 :(得分:0)

如果您convert your mapvanilla XSLT,则映射变得简单明了:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      version="1.0">

   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="itemSchedules" 
            match="/DetailsResponse/ScheduleDetails/item" 
            use="concat(DocumentNumber,'-',ItemNumber)" />

   <xsl:template match="/DetailsResponse">
      <Response>
         <Data>
            <Items>
               <xsl:apply-templates select="ItemDetails/item" />
            </Items>
         </Data>
      </Response>
   </xsl:template>

   <xsl:template match="item">
      <Item>
         <LineNumber>
            <Internal>
               <xsl:value-of select="ItemNumber"/>
            </Internal>
         </LineNumber>
         <ConfirmedQuantity>
            <Value>
               <xsl:value-of select="format-number(key('itemSchedules', 
                concat(DocumentNumber,'-',ItemNumber))/ConfirmedQuantity,0)" />
            </Value>
         </ConfirmedQuantity>
         <Article>
            <Number>
               <xsl:value-of select="MaterialNumber"/>
            </Number>
            <Description>
               <xsl:value-of select="Description"/>
            </Description>
         </Article>
      </Item>
   </xsl:template>
</xsl:stylesheet>

xsl:key保留了对拼图的计划详情“部分”的引用索引,我们创建了DocumentNumberItemNumber的链接密钥。