biztalkbiztalk-mapper

Mapping two records to same node, where one is an iteration of a child record of the other


I wish to create a iteration of a node to a node on the source schema. This is easy enough, but the trouble comes when I want to create different iterations on the same node based on a child of the first node.

<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>

There can be one current_balance per customer, but several invoices, and I need to map them to the same node on the target schema, and have it look like this:

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

I have tried table looping, regular looping, conditional looping, and created xslt (which I also am very inexperienced with), and can't seem to make it work. I am only able to make either one of each or two of each.

Edit: I am currently trying an 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>

The for-each does not output anything at all, I have tried both case/customer/invoices/invoice and case/customer/invoices. I just cannot make this work at all


Solution

  • This one should work. You should loop in /cases/customer/account/invoices/invoice not 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