Subject:flatten xml structure then sort output based on attribute value Author:todd jackson Date:03 Aug 2008 08:16 PM Originally Posted: 03 Aug 2008 08:07 PM
I have a source xml file which erroneously contains a table_field tag within a table_field tag, I have found a solution to break this out or flatten the structure so tha all table_field tags are on the same level.
However I need to be able to sort the order of the output, i.e. the table_field with attribute title='Study_Method' must appear first in the order of the table_fields to the output result tree.
<Root>
<program>
<Tableheading>National Certificate in Business Administration and Computing (Level 3)</Tableheading>
<table_field title="Qualification">
<Tablebold aid:pstyle="Tablebold">
<table_field title="Study_Method">
<Tablebold aid:pstyle="Tablebold">Study Method</Tablebold>
<Tablelight aid:cstyle="Tablelight">Full time or part time</Tablelight>
</table_field>
Qualification
</Tablebold>
<Tablelight aid:cstyle="Tablelight">National Certificate</Tablelight>
</table_field>
<table_field title="Duration">
<Tablebold aid:pstyle="Tablebold">Duration</Tablebold> <Tablelight aid:cstyle="Tablelight">1 year full time</Tablelight>
</table_field>
<table_field title="Applications">
<Tablebold aid:pstyle="Tablebold">Applications</Tablebold>
<Tablelight aid:cstyle="Tablelight">Accepted until the programme is full, apply four weeks prior to start dates</Tablelight>
</table_field>
.........
My XSLT style sheet format needs to be able to correct the above format to this;
<Root>
<program>
<Tableheading>National Certificate in Business Administration and Computing (Level 3)</Tableheading>
<table_field title="Study_Method">
<Tablebold aid:pstyle="Tablebold">Study Method</Tablebold>
<Tablelight aid:cstyle="Tablelight">Full time or part time</Tablelight>
</table_field>
<!-- this will match and every node & attribute copy to output as it parses -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- this will match the program node & attribute copy to output when matched against the program node -->
<xsl:template match="program">
<xsl:copy>
<xsl:apply-templates select="Tableheading | table_field/Tablebold/table_field[@title='Study_Method'] | table_field" mode="element-node-mod" />
<!-- this will cause nodes to be suppressed -->
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Do not copy table_field/Tablebold/table_field[@title='Study_Method'] | table_field nodes to the output document i.e. doesn't out put the source xml nodes matching tablefields -->
<xsl:template match="Tableheading | table_field/Tablebold/table_field[@title='Study_Method'] | table_field" />
<!-- output the above copied table_fields and their child table_field nodes and copy to the output document -->