cancel
Showing results for 
Search instead for 
Did you mean: 

XSLT Mapping - Fetch details based on value from another node value

itabhishek9
Participant
0 Kudos

Hi SDNites,

I wanted to fetch value from a node whose value will be fetched only when its sibling value matches with the value of other node. Below is the example,

<Parent>

<AllSalesOrder>

<Sales Order>

<lineitem>10 </lineitem>

<shelflife>9 days</shelflife>

</Sales Order>

<Sales Order>

<lineitem>20 </lineitem>

<shelflife>7 days</shelflife>

</Sales Order>

<AllSalesOrder>

<Payload2>

<matchrecord>

<record1>10</record1>

<record2>random val for 10</record2>

</matchrecord>

<matchrecord>

<record1>20</record1>

<record2>random val for 20</record2>

</matchrecord>

</Payload2>

</Parent>

In the above, I have to match the value of,

matchrecord/record1 with AllSalesOrder/Sales Order/lineitem and get the value of

AllSalesOrder/Sales Order/shelflife

Can you please advise how to achieve this in XSLT.

Regards,

Abhi

Accepted Solutions (1)

Accepted Solutions (1)

former_member190293
Active Contributor
0 Kudos

Hi Abhishek!

Input:

<?xml version="1.0" encoding="UTF-8"?>
<Parent>
    <AllSalesOrder>
        <SalesOrder>
            <lineitem>10</lineitem>
            <shelflife>9 days</shelflife>
        </SalesOrder>
        <SalesOrder>
            <lineitem>20</lineitem>
            <shelflife>7 days</shelflife>
        </SalesOrder>
    </AllSalesOrder>
    <Payload2>
        <matchrecord>
            <record1>10</record1>
            <record2>random val for 10</record2>
        </matchrecord>
        <matchrecord>
            <record1>20</record1>
            <record2>random val for 20</record2>
        </matchrecord>
    </Payload2>
</Parent>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <output>
            <xsl:for-each select="Parent/AllSalesOrder/SalesOrder">
                <matchrecord>
                    <record1><xsl:value-of select="lineitem"/></record1>
                    <record2>
                        <xsl:variable name="id" select="lineitem"/>
                        <xsl:value-of select="/Parent/Payload2/matchrecord[record1 = $id]/record2"/></record2>
                    <record3><xsl:value-of select="shelflife"/></record3>
                </matchrecord>
            </xsl:for-each>
        </output>
    </xsl:template>
</xsl:stylesheet>

Output:

<?xml version="1.0" encoding="utf-8"?>
<output>
    <matchrecord>
        <record1>10</record1>
        <record2>random val for 10</record2>
        <record3>9 days</record3>
    </matchrecord>
    <matchrecord>
        <record1>20</record1>
        <record2>random val for 20</record2>
        <record3>7 days</record3>
    </matchrecord>
</output>

Regards, Evgeniy.

itabhishek9
Participant
0 Kudos

Thanks Evgeniy for your help. It worked.

Answers (2)

Answers (2)

itabhishek9
Participant
0 Kudos

Thanks Evgeniy for the response.

Output should look like below,

<output>

<matchrecord>
<record1>10</record1>
<record2>random val for 10</record2>

<record3>9 days</record3>
</matchrecord>

<matchrecord>
<record1>20</record1>
<record2>random val for 20</record2>

<record3>7 days</record3>
</matchrecord>

</output>

In the above, record1 from matchrecord has been matched with Sales Order->lineitem and then populated that record in the output.

Regards,

Abhi

former_member190293
Active Contributor
0 Kudos

Hi Abhishek!

Wouldn't you clarify how output structure should look like?

Regards, Evgeniy.