[xsl] XML grouping/sorting question - displaying a matrix

Subject: [xsl] XML grouping/sorting question - displaying a matrix
From: "Kevin Daniels" <KevinDaniels@xxxxxxxxxxx>
Date: Tue, 30 Mar 2004 00:59:58 -0500
I'm fairly new to XSL, but have been finding the great XSL resources out
there a great help.  Specifically, I have spent some time going through the
various materials on Jeni Tennison's web site, most recently dealing with
grouping and sorting
(http://www.jenitennison.com/xslt/grouping/muenchian.html).
I have a sample data set (trimmed down for simplicity) which looks like
this:
<records>
 <record>
  <id>0001</id>
  <test id="0001">
   <title>Mr</title>
   <forename>John</forename>
   <name>X</name>
  </test>
  <test id="0002">
   <title>Dr</title>
   <forename>Amy</forename>
   <name>B</name>
  </test>
 </record>
 <record>
  <id>0002</id>
  <test id="0003">
   <title>Mr</title>
   <forename>Tim</forename>
   <name>Y</name>
  </test>
  <test id="0004">
   <title>Dr</title>
   <forename>Kevin</forename>
   <name>X</name>
  </test>
 </record>
...
</records>

and am processing it using XSL in the following way:

<xsl:template match="records">
<html>
<body>
<table>
<xsl:for-each select="recod/test[count(. | key('test-by-name', name)[1]) =
1]">
<tr><td><xsl:value-of select="name" />|<xsl:value-of select="name()"
/></td></tr>
</xsl:for-each>
 <tr>
 <td>ID</td>
 <xsl:for-each select="record/test[count(. | key('test-by-name', name)[1]) =
1]">
  <td><xsl:value-of select="name" /></td>
 </xsl:for-each>
 </tr>
 <xsl:for-each select="record">
 <tr>
 <td><xsl:value-of select="id" /></td>
  <xsl:for-each select="test[count(. | key('test-by-name', name)[1]) = 1]">
   <td><xsl:value-of select="name" /></td>
  </xsl:for-each>
 </tr>
 </xsl:for-each>
</table>
</body>
</html>
</xsl:template>

I am able to get the list of unique tests for all records, but ultimately I
would like a way to produce a matrix similar to the following:

ID        X    B    Y    C
0001      *    *
0002      *         *
0003      *              *
0004      *              *

Is there a way to match each record/test node with the position in the key
value and generate a matrix?

Finally, I would ultimately like to sort the columns in the above matrix by
element count so that the elements which appear most are in the first
columns, though I haven't found a way to do this:

ID        X    C    B    Y
0001      *         *
0002      *              *
0003      *    *
0004      *    *

Any help would be appreciated, even if it's - "Sry this isn't possible with
XSLT 1.0".  Thanks,

Kevin

Current Thread