i am trying to write XSLT mapping to move Segments to its corresponding header segment based on key field matches in (key field name ) and (key field name ) segments (MAT=IDEN), If key field not matches then no need to pass segment, i have written XSLT, but its not giving required transformation.
i attached sample input and output as below. Please check.
Input:
<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
<CODI BEGIN="1">
<L20 SEGMENT="1">
<ELN>Value1</ELN>
<L24 SEGMENT="1">
<MAT>12345</MAT>
<ITEM SEGMENT="1">
<IDEN>12345</IDEN>
<Fields>00</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>45678</IDEN>
<Fields>10</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>45678</IDEN>
<Fields>11</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>667788</IDEN>
<Fields>12</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>667788</IDEN>
<Fields>13</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>112233</IDEN>
<Fields>20</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>45678</MAT>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>60987</MAT>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>667788</MAT>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>112233</MAT>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
</L20>
</CODI>
</HEADER>
** Desired Output:**
<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
<CODI BEGIN="1">
<L20 SEGMENT="1">
<ELN>Value1</ELN>
<L24 SEGMENT="1">
<MAT>12345</MAT>
<ITEM SEGMENT="1">
<IDEN>12345</IDEN>
<Fields>00</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>45678</MAT>
<ITEM SEGMENT="1">
<IDEN>45678</IDEN>
<Fields>10</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>45678</IDEN>
<Fields>11</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>60987</MAT>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>667788</MAT>
<ITEM SEGMENT="1">
<IDEN>667788</IDEN>
<Fields>12</Fields>
</ITEM>
<ITEM SEGMENT="1">
<IDEN>667788</IDEN>
<Fields>13</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
<L24 SEGMENT="1">
<MAT>112233</MAT>
<ITEM SEGMENT="1">
<IDEN>112233</IDEN>
<Fields>20</Fields>
</ITEM>
<L19 SEGMENT="1">
<LF>Value2</LF>
</L19>
</L24>
</L20>
</CODI>
</HEADER>
** XSLT I used is below:**
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="child-by-key" match="child" use="@IDEN" />
<!-- Identity template to copy all nodes as-is -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//L24">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:for-each select="key('child-by-key', @IDEN)">
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Please assist here.