Hi,
I have a problem with grouping. My source XML has <record> elements that have a @name and a @group attribute. It looks something like this:
- <root>
-
<result>
-
<record name="test1" group="group1"><value>1A</value></record>
-
<record name="test2" group="group1"><value>1B</value></record>
-
<record name="test3" group="group1"><value>1C</value></record>
-
<record name="test1" group="group2"><value>2A</value></record>
-
<record name="test3" group="group2"><value>2F</value></record>
-
<record name="test4" group="group2"><value>2E</value></record>
-
<record name="test2" group="group3"><value>3A</value></record>
-
<record name="test3" group="group3"><value>3B</value></record>
-
<record name="test5" group="group3"><value>3E</value></record>
-
</result>
-
<result>
-
<record name="test1" group="group1"><value>1A</value></record>
-
<record name="test2" group="group1"><value>1B</value></record>
-
<record name="test3" group="group1"><value>1C</value></record>
-
<record name="test8" group="group4"><value>4D</value></record>
-
<record name="test9" group="group4"><value>4E</value></record>
-
</result>
-
</root>
The goal is to have a html output, that shows the results as tables, one table per result which should look something like this:
---------------------------------------------
Result 1 | 1 | 2 | 3 |
---------------------------------------------
test1 | 1A | 2A | |
---------------------------------------------
test2 | 1B | | 3A |
---------------------------------------------
test3 | 1C | 2F | 3B |
---------------------------------------------
test4 | | 2E | |
---------------------------------------------
test5 | | | 3E |
---------------------------------------------
------------------------------------------------------
Result 2 | 1 | 2 | 3 | 4 |
------------------------------------------------------
test1 | 1A | | | |
------------------------------------------------------
test2 | 1B | | | |
------------------------------------------------------
test3 | 1C | | | |
------------------------------------------------------
test8 | | | | 4D |
------------------------------------------------------
test9 | | | | 4E |
------------------------------------------------------
For the numer of rows in the table I need to group the records by the @name attribute. I tried doing this with a <xsl:key>.
This is my XSLT stylesheet:
- <xsl:key name="nameKey" match="record" use="@name"/>
-
<xsl:template match="/">
-
<html>
-
<head>
-
</head>
-
<body>
-
<xsl:for-each select="root/result">
-
<xsl:variable name="positionResult" select="position()"/>
-
-
<xsl:element name="table">
-
<xsl:attribute name="border"><xsl:text>1</xsl:text></xsl:attribute>
-
<xsl:element name="thead">
-
<xsl:element name="tr">
-
<xsl:element name="td">
-
<xsl:text>Result </xsl:text><xsl:value-of select="$positionResult"/>
-
</xsl:element>
-
<xsl:element name="td"><xsl:text>1</xsl:text></xsl:element>
-
<xsl:element name="td"><xsl:text>2</xsl:text></xsl:element>
-
<xsl:element name="td"><xsl:text>3</xsl:text></xsl:element>
-
<xsl:element name="td"><xsl:text>4</xsl:text></xsl:element>
-
<xsl:element name="td"><xsl:text>5</xsl:text></xsl:element>
-
</xsl:element>
-
</xsl:element>
-
<xsl:element name="tbody">
-
<xsl:for-each select="record[count(. | key('nameKey', @name)[1]) = 1]">
-
<xsl:sort select="@name" order="ascending"/>
-
<xsl:variable name="names" select="@name"/>
-
-
<xsl:element name="tr">
-
<xsl:element name="td"><xsl:value-of select="$names"/></xsl:element>
-
<xsl:element name="td"><xsl:value-of select="//result[$positionResult]/record[@name = $names and @group = 'group1']/value"/><xsl:text>*</xsl:text></xsl:element>
-
<xsl:element name="td"><xsl:value-of select="//result[$positionResult]/record[@name = $names and @group = 'group2']/value"/><xsl:text>*</xsl:text></xsl:element>
-
<xsl:element name="td"><xsl:value-of select="//result[$positionResult]/record[@name = $names and @group = 'group3']/value"/><xsl:text>*</xsl:text></xsl:element>
-
<xsl:element name="td"><xsl:value-of select="//result[$positionResult]/record[@name = $names and @group = 'group4']/value"/><xsl:text>*</xsl:text></xsl:element>
-
<xsl:element name="td"><xsl:value-of select="//result[$positionResult]/record[@name = $names and @group = 'group5']/value"/><xsl:text>*</xsl:text></xsl:element>
-
</xsl:element>
-
-
</xsl:for-each>
-
</xsl:element>
-
</xsl:element>
-
</xsl:for-each>
-
</body>
-
</html>
-
</xsl:template>
Somehow however the resulting HTML does not show me the rows for test1, test2 and test3 for the second result table. Instead it looks like this:
------------------------------------------------------
Result 2 | 1 | 2 | 3 | 4 |
------------------------------------------------------
test8 | | | | 4D |
------------------------------------------------------
test9 | | | | 4E |
------------------------------------------------------
I think this is because the <xsl:key> for these has already been used in the first iteration ??! There is no way to predict the number of result elements in the source XML so I can't use a different <xsl:key> for each iteration...
Is there some other way to group the elements ?
Thank you very much !!
Leira