将两个记录映射到同一节点,其中一个是另一个的子记录的迭代

时间:2018-07-24 07:57:27

标签: biztalk biztalk-mapper

我希望在源模式上创建一个节点到节点的迭代。这很容易,但是当我想基于第一个节点的子节点在同一节点上创建不同的迭代时,麻烦就来了。

<cases>
    <customer>
        <account>
        <name>John Smith</name>
        <address>hello road 321</address>
        <current_balance>100</current_balance>
        <current_balance_date>20180712</current_balance_date>
        </account>
        <invoices>
             <invoice>
                <amount>231</amount>
                <paydate>20183104</paydate>
             </invoice>
             <invoice>
                <amount>2332</amount>
                <paydate>20181204</paydate>
             </invoice>
         </invoices>
     </customer>    
</cases>

每个客户可以有一个 current_balance ,但是有几张发票,我需要将它们映射到目标架构上的同一节点,并且看起来像这样:

<basis>
    <toPay>100</toPay>
    <dateToPay>20180712</dateToPay>
</basis>
<basis>
    <toPay>231</toPay>
    <dateToPay>20183104</dateToPay>
</basis>
<basis>
    <toPay>2332</toPay>
    <dateToPay>20181204</dateToPay>
</basis>

我尝试了表循环,常规循环,条件循环,并创建了xslt(我也很缺乏经验),但似乎无法使其工作。我只能制作一个或两个。

编辑:我目前正在尝试xslt-inline-call:

<xsl:template name="basis">

<!-- balance-parameters -->
<xsl:param name="current_balance" />
<xsl:param name="current_balance_date" />

<!-- invoice-parameters -->
<xsl:param name="amount" />
<xsl:param name="paydate" />

<xsl:element name="basis">
    <xsl:element name="toPay"><xsl:value-of select="$current_balance" /></xsl:element>
    <xsl:element name="dateToPay"><xsl:value-of select="$current_balance_date" /></xsl:element>
</xsl:element>

<xsl:for-each select="cases/customer/account/invoices/invoice">
    <xsl:element name="basis">
        <xsl:element name="toPay"><xsl:value-of select="$amount" /></xsl:element>
        <xsl:element name="dateToPay"><xsl:value-of select="$paydate" /></xsl:element>
    </xsl:element>
</xsl:for-each>

</xsl:template>

for-each根本不输出任何内容,我已经尝试了case / customer / invoices / invoice和case / customer / invoices。我根本无法完成这项工作

2 个答案:

答案 0 :(得分:0)

首先,确保源模式具有基础并将其设置为maxOccurs = unbounded。

这实际上非常简单。 current_balance应该仅用于链接。

您将需要将Looping Functoid链接发票和基础,并将另一个Looping Functoid链接current_balance和base。

这应该在xsl中创建两个for-each,您可以使用Validate Map进行查看。

答案 1 :(得分:0)

这应该有效。您应循环输入/ cases / customer / account / invoices / invoice而不是case / customer / invoices / invoice

<xsl:template name="basis"> 
<basis>
    <toPay>
        <xsl:value-of select="/cases/customer/account/current_balance" />
    </toPay>
    <dateToPay>
        <xsl:value-of select="/cases/customer/account/current_balance_date" />
    </dateToPay>
</basis>

<xsl:for-each select="/cases/customer/account/invoices/invoice">
    <basis>
        <toPay>
            <xsl:value-of select="amount" />
        </toPay>
        <dateToPay>
            <xsl:value-of select="paydate" />
        </dateToPay>
    </basis>
</xsl:for-each></xsl:template>

enter image description here