Subject: RE: [xsl] Tabluation via XSLT. From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Wed, 4 Apr 2007 10:12:00 +0100 |
Your basic approach doesn't seem wrong to me (or procedural). But the code can be simplified a lot, for example I think you can replace: <xsl:variable name="current_col" select="."/> <!-- only choose the ratings where it exists against the row currently being processed --> <xsl:for-each select="$col_rating"> <xsl:choose> <xsl:when test=".//@name=$current_col"> <xsl:value-of select=".//@rating"/> </xsl:when> </xsl:choose> </xsl:for-each> by <xsl:for-each select="$col_rating[@name=current()]"> <xsl:value-of select="@rating"/> </xsl:for-each> Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Furry Pop [mailto:furrypop@xxxxxxxxx] > Sent: 04 April 2007 09:55 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Tabluation via XSLT. > > Hi, > > I've got an XML document that I wish to convert into an HTML > table. It requires further transformation by some third > party XSL libraries, which I will include in my XSLT and call > their templates with modes to do their clever stuff. > > My approach so far has been rather procedural, and I have had > to use variables, etc to maintain state. For instance, I use > a key to remove duplicates from the items to form the column > headings and then cycle through each row, matching against > the XML via the key. Each row is sorted in order to keep it > aligned with the column headings. The problem with this is > that, particularly with the column headers, I lose sight of > the original XML structure, thereby preventing me from > applying further templates and using the mode functionality. > > Is there a more declarative approach to this processing > wherein I can build the column headings without using > variables and then populate each row in the knowledge that > the appropriate item is being inserted into the appropriate > column? I'm thinking of some better use of apply-templates > or some clever recursion but I can't see how to do it. > > A much simplified version of source file and my sample XSLT > look something like the following:- > > SOURCE FILE:- > [code] > <?xml version="1.0" encoding="UTF-8"?> > <container> > <item> > <value name="arthur"> > <item> > <value rating="X" name="joyce"/> > <value rating="W" name="ida"/> > </item> > </value> > </item> > <item> > <value name="bertrand"> > <item> > <value rating="Y" name="ida"/> > </item> > </value> > </item> > <item> > <value name="colin"> > <item> > <value rating="Z" name="joyce"/> > </item> > </value> > </item> > <item> > <value name="derek"> > <item> > <value rating="X" name="joyce"/> > </item> > </value> > </item> > <item> > <value name="edward"> > <item> > <value rating="Y" name="hilda"/> > <value rating="W" name="joyce"/> > </item> > </value> > </item> > <item> > <value name="frederick"> > <item> > <value rating="Z" name="ida"/> > </item> > </value> > </item> > </container> > [/code] > > XSLT:- > [code] > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:fo="http://www.w3.org/1999/XSL/Format"> > <xsl:output method="html"/> > <xsl:key name="distinct-col" > match="container/item/value/item/value/@name" > use="."/> > <!-- store unique (ie "distinct") column headings for use > later--> <xsl:variable name="cols" > select="container/item/value/item/value/@name[generate-id()=ge > nerate-id(key('distinct-col',.))]"/> > <xsl:template match="/"> > <html> > <head> > <title>TEST CODE FOR TABULATION</title> > </head> > <body> > <table> > <tr> > <td class="rowtitle" /> > <!-- set the column headings --> > <xsl:for-each select="$cols"> > <xsl:sort/> > <td class="coltitle"> > <xsl:value-of select="."/> > </td> > </xsl:for-each> > </tr> > <!-- create the rows --> > <xsl:apply-templates > select="container/item/value"> > <xsl:sort/> > </xsl:apply-templates> > </table> > </body> > </html> > </xsl:template> > <xsl:template match="container/item/value"> > <tr> > <td class="rowtitle"> > <xsl:value-of select=".//@name"/> > </td> > <!-- squirrel away the tree of ratings under the row > currently being processed --> > <xsl:variable name="col_rating" > select="item/value"/> > <!-- display the rating for each col (the latter sorted in > line with the column headings above) --> > <xsl:for-each select="$cols"> > <xsl:sort/> > <td> > <!-- squirrel away the col currently being viewed > --> > <xsl:variable name="current_col" select="."/> > <!-- only choose the ratings where it exists against the > row currently being processed --> > <xsl:for-each select="$col_rating"> > <xsl:choose> > <xsl:when test=".//@name=$current_col"> > <xsl:value-of select=".//@rating"/> > </xsl:when> > </xsl:choose> > </xsl:for-each> > </td> > </xsl:for-each> > </tr> > </xsl:template> > </xsl:stylesheet> > [/code] > > Thanks for any help, > > J. > > XSL Processor = Altova XMLSpy 2007 Professional > > ________________________________________________ > F.Pop Esq is currently trading under the moniker > -> DRAWING PIN <- > http://drawingpin.iuma.com > > Always trying to pin me down. > Why a title for your sound? > > > > > > ___________________________________________________________ > To help you stay safe and secure online, we've developed the > all new Yahoo! Security Centre. http://uk.security.yahoo.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Tabluation via XSLT., Furry Pop | Thread | RE: [xsl] Tabluation via XSLT., Furry Pop |
[xsl] Re: xsl-list Digest 4 Apr 200, john jacks | Date | [xsl] Xsl:variable content should b, Alan Hale |
Month |