I am struggling with the concept of grouping (on multiple keys) of table based XML to hierarchy with XSLT
The grouping is based on first four elements, however the grouping must break if there is another element in between the set.
Source XML:
<RECORDS>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F1>A1</F1>
</RECORD>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F1>A2</F1>
</RECORD>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>195</E5>
<F1>A3</F1>
</RECORD>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F1>A4</F1>
</RECORD>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F1>A5</F1>
</RECORD>
<RECORD>
<E1>DONALD</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F1>A6</F1>
</RECORD>
<RECORD>
<E1>DONALD</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F1>A7</F1>
</RECORD>
</RECORDS>
Output XML
<RECORDS>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F>
<F1>A1</F1>
<F1>A2</F1>
</F>
</RECORD>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>195</E5>
<F>
<F1>A3</F1>
<F1>A4</F1>
</F>
</RECORD>
<RECORD>
<E1>MICKEY</E1> <!--Must break and not merge in first group -->
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F>
<F1>A5</F1>
</F>
</RECORD>
<RECORD>
<E1>DONALD</E1>
<E2>TEST</E2>
<E4>14</E4>
<E5>196</E5>
<F>
<F1>A6</F1>
<F1>A7</F1>
</F>
</RECORD>
</RECORDS>
Here is the XSL I have come up with so far...
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="grouped" match="RECORD"
use="concat(E1, '+', E2, '+', E4 , '+', E5 )"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<RECORDS>
<xsl:apply-templates select=
"RECORD[generate-id()
=
generate-id(key('grouped',
concat(E1, '+', E2, '+', E4 , '+', E5 )
)
[1]
)
]
"/>
</RECORDS>
</xsl:template>
<xsl:template match="RECORD">
<RECORD>
<E1><xsl:value-of select="E1"/></E1>
<E2><xsl:value-of select="E2"/></E2>
<E4><xsl:value-of select="E4"/></E4>
<F>
<xsl:for select="F1">
<F1><xsl:value-of select="F1"/></F1>
</xsl:for>
</F>
</RECORD>
</xsl:template>
</xsl:stylesheet>
The issue is that I am unable to generate the inner tag reapeating for each f1. Also I should get 4 set of RECORDS, not 3 that I get with this.
<RECORDS>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<F></F>
</RECORD>
<RECORD>
<E1>MICKEY</E1>
<E2>TEST</E2>
<E4>14</E4>
<F></F>
</RECORD>
<RECORD>
<E1>DONALD</E1>
<E2>TEST</E2>
<E4>14</E4>
<F></F>
</RECORD>
</RECORDS>