[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Sorting Two Dimensional Table


Subject: RE: [xsl] Sorting Two Dimensional Table
From: "Pierre-Luc Bertrand" <Pierre-Luc.Bertrand@xxxxxxxxxx>
Date: Tue, 16 Oct 2007 11:26:09 -0400

<?xml-stylesheet type="text/xsl" href="test.xsl"?>

There are no stupid question... I'm not in a position to say that
questions are stupid ;)

Pierre

-----Original Message-----
From: Scott Trenda [mailto:Scott.Trenda@xxxxxxxx]
Sent: Tuesday, October 16, 2007 11:22 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] Sorting Two Dimensional Table

... Stupid question, but are you transforming it on the server side
first, or are you just putting an <?xml-stylesheet?> reference in your
XML and expecting IE to transform it?

~ Scott


-----Original Message-----
From: Pierre-Luc Bertrand [mailto:Pierre-Luc.Bertrand@xxxxxxxxxx]
Sent: Tuesday, October 16, 2007 10:19 AM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] Sorting Two Dimensional Table

Hi,

Thanks for that answer but unfortunately, I can't get it to work. I
don't know if it is due to the fact that I'm using Internet Explorer to
see the transform but I'm getting this error:

'Reference to variable or parameter 'k1' must evaluate to a node list.'

I tried to debug it but I'm not too convinced of what I'm doing is good.

In the article http://www.dpawson.co.uk/xsl/sect2/N8090.html, question 4
(you wrote it), I'm suppose to get only one node but I think what we
want is a sorted nodelist of the keys. I'm not sure what the xs:string+
is but it seems to be a string. Is it possible that I should be using
something like what is described by Andrew Welch in
http://ajwelch.blogspot.com/2007/02/csv-to-xml-converter-in-xslt-20.html
to get a nodelist from the values that are concatenated (this is a guess
based on my understanding of question 6 by Jeni Tennison of
http://www.dpawson.co.uk/xsl/sect2/N8090.html )

If you can help me again to debug that one, it would be appreciated.

Thanks again.

Pierre

-----Original Message-----
From: David Carlisle [mailto:davidc@xxxxxxxxx]
Sent: Monday, October 15, 2007 3:14 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] Sorting Two Dimensional Table




<x>
<titles>
	<key>z</key>
	<key>a</key>
	<value>valueX</value>
</titles>



<entries>
  <entry>
    <key name="a" value="b" />
    <key name="z" value="c" />
    <value>myValue1</value>
  </entry>
  <entry>
    <key name="a" value="b" />
    <key name="z" value="d" />
    <value>5</value>
  </entry>
  <entry>
    <key name="a" value="a" />
    <key name="z" value="c" />
    <value>myValue3</value>
  </entry>
  <entry>
    <key name="a" value="b" />
    <key name="z" value="d" />
    <value>4</value>
  </entry>
</entries>
</x>


<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		xmlns:xs="http://www.w3.org/2001/XMLSchema"
		exclude-result-prefixes="xs">

  <xsl:variable name="k1" as="xs:string+">
    <xsl:perform-sort select="x/titles/key">
      <xsl:sort select="."/>
    </xsl:perform-sort>
  </xsl:variable>

  <xsl:output indent="yes"/>

  <xsl:template match="x">


   <table>
     <tr>
       <xsl:for-each select="$k1,titles/value">
	 <th><xsl:value-of select="."/></th>
       </xsl:for-each>
     </tr>

    <xsl:call-template name="entries">
      <xsl:with-param name="k" select="$k1"/>
      <xsl:with-param name="e" select="entries/entry"/>
    </xsl:call-template>
   </table>

  </xsl:template>

  <xsl:template name="entries">
    <xsl:param name="k"/>
    <xsl:param name="e"/>
    <xsl:choose>
      <xsl:when test="empty($k)">
	<xsl:apply-templates select="$e">
	  <xsl:sort lang="en" select="value"/>
	</xsl:apply-templates>
      </xsl:when>
      <xsl:otherwise>
	<xsl:for-each-group select="$e"
group-by="key[@name=$k[1]]/@value">
	  <xsl:sort lang="en" select="key[@name=$k[1]]/@value"/>
	  <xsl:call-template name="entries">
	    <xsl:with-param name="k" select="$k[position()!=1]"/>
	    <xsl:with-param name="e" select="current-group()"/>
	  </xsl:call-template>
	</xsl:for-each-group>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

<xsl:template match="entry">
    <xsl:variable name="here" select="."/>
    <tr>
      <xsl:for-each select="$k1">
	 <td><xsl:value-of
select="$here/key[@name=current()]/@value"/></td>
       </xsl:for-each>
       <td><xsl:value-of select="value"/></td>
    </tr>
</xsl:template>

</xsl:stylesheet>


$ saxon8 2dsort.xml  2dsort.xsl
<?xml version="1.0" encoding="UTF-8"?>
<table>
   <tr>
      <th>a</th>
      <th>z</th>
      <th>valueX</th>
   </tr>
   <tr>
      <td>a</td>
      <td>c</td>
      <td>myValue3</td>
   </tr>
   <tr>
      <td>b</td>
      <td>c</td>
      <td>myValue1</td>
   </tr>
   <tr>
      <td>b</td>
      <td>d</td>
      <td>4</td>
   </tr>
   <tr>
      <td>b</td>
      <td>d</td>
      <td>5</td>
   </tr>
</table>

________________________________________________________________________
The Numerical Algorithms Group Ltd is a company registered in England
and Wales with company number 1249803. The registered office is:
Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom.

This e-mail has been scanned for all viruses by Star. The service is
powered by MessageLabs.
________________________________________________________________________


Current Thread
Keywords
xml