Сопоставление связанного повторяющегося узла с повторяющимся узлом в BizTalk Mapper

Я пытаюсь сделать карту на BizTalk 2013, и я заблокирован этой проблемой сопоставления (с использованием картографа):

Введите сообщение:

<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 и ScheduleDetails с Item путем «объединения» их данных на основе ItemNumber. Я уже много чего перепробовал, но пока не смог.

Я не смог найти ни одного примера по этому поводу. Есть ли у этого шаблона какое-то конкретное имя?

Если у кого-то есть идеи, которыми они могут поделиться, это будет оценено.


person Ricardo    schedule 28.01.2014    source источник
comment
Это можно сделать только с помощью функтоидов Call Xslt Template. Вот несколько пояснений: adventuresinsidethemessagebox.wordpress.com/2012/04/01/   -  person FCR    schedule 29.01.2014


Ответы (2)


Единственный способ, которым я могу думать, возможно, заставить это работать с Functoids, - это связать ItemDetails и ScheduleDetails с одним или несколькими циклическими Functoids и использовать Equal Functoid для фильтрации ScheduleDetails на основе текущего ItemDetail ItemNumber.

Если это не сработает, единственный другой вариант — пользовательский Xslt. Шаблон вызова был бы довольно простым.

person Johns-305    schedule 28.01.2014

Если вы преобразуйте свою карту в vanilla 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 сохраняет индекс ссылок на «часть» головоломки с деталями расписания, и мы создаем связанный ключ DocumentNumber и ItemNumber.

person StuartLC    schedule 29.01.2014