I'm using XSLT 1.0. I have <RowBreak>
and <ColumnBreak>
elements in my XML file. RowBreak will group my data by row, while ColumnBreak will transform to columns. For as long as there's no match for ColumnBreak or RowBreak, the display should continue downwards.
Here is my XML:
<?xml version="1.0" encoding="utf-8" ?>
<Tree>
<Item>
<Label>Item 1</Label>
</Item>
<Item>
<Label>Item 2</Label>
</Item>
<ColumnBreak />
<Item>
<Label>Item 3</Label>
</Item>
<Item>
<Label>Item 4</Label>
</Item>
<Item>
<Label>Item 5</Label>
</Item>
<RowBreak />
<Item>
<Label>Item 6</Label>
</Item>
<Item>
<Label>Item 7</Label>
</Item>
<ColumnBreak />
<Item>
<Label>Item 8</Label>
</Item>
<RowBreak />
<Item>
<Label>Item 9</Label>
</Item>
<Item>
<Label>Item 10</Label>
</Item>
</Tree>
The expected output is this:
Item 1 Item 3
Item 2 Item 4
Item 5
Item 6 Item 8
Item 7
Item 9
Item 10
EDIT: Here's my updated XSLT. I still couldn't figure out how to do the nested grouping.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/>
<xsl:key name="rowGroups" match="Tree/*[not(self::RowBreak)]" use="count(preceding-sibling::RowBreak)" />
<xsl:template match="Tree">
<xsl:variable name="rowGroupings" select="*[not(self::RowBreak)][generate-id() = generate-id(key('rowGroups', count(preceding-sibling::RowBreak))[1])]" />
<xsl:variable name="position" select="position()" />
<table>
<xsl:for-each select="$rowGroupings">
<xsl:variable name="rowId" select="generate-id()"/>
<xsl:variable name="colGroupings" select="$rowGroupings[not(self::ColumnBreak)][generate-id()=$rowId][1]" />
<tr>
<td>
<xsl:for-each select="$colGroupings">
<xsl:sort select="$colGroupings[preceding-sibling::ColumnBreak]" order="descending" />
<xsl:if test="position() = 1">
<xsl:variable name="maxRows" select="$colGroupings[preceding-sibling::ColumnBreak]" />
<xsl:call-template name="ColumnGroupTemplate">
<xsl:with-param name="maxRows" select="$maxRows" />
<xsl:with-param name="colGroupings" select="$colGroupings" />
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
<xsl:template name="ColumnGroupTemplate">
<xsl:param name="maxRows" />
<xsl:param name="colGroupings" />
<xsl:for-each select="$maxRows">
<xsl:variable name="position" select="position()" />
<tr>
<xsl:for-each select="$colGroupings">
<xsl:variable name="group" select="$colGroupings[preceding-sibling::ColumnBreak]" />
<td>
<xsl:value-of select="normalize-space($colGroupings[position() = $position])" />
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
How do I achieve the expected output using Muenchian grouping? Thanks!