Subject: RE: [xsl] XSLT 1.0 : HTML table with From: jeanph01 <jeanph01@xxxxxxxx> Date: Thu, 22 Apr 2010 16:07:32 -0400 |
Thank you for responding. But I wonder, can I do it in a single xsl file in a single call? Because I cannot have and intermediate transformation with 2 calls, I have to do it in one shot. Maybe I do not understand a capability of xsl:copy ? I managed to get what I wanted in the meantime but i'm not sure if this is the best solution in term of performance because it will have to go through $champs for each td: <xsl:key name="names" match="*|@*" use="name()"/> <xsl:variable name="champs" select="//SearchResult/*[not(.=following::*) and (generate-id(.) = generate-id(key('names', name(.))[1]))]"></xsl:variable> <xsl:template match="/Output/SearchResults"> <table border="1"> <thead> <tr> <xsl:for-each select="$champs"> <th> <xsl:value-of select="local-name()"/> </th> </xsl:for-each> </tr> </thead> <tbody> <xsl:apply-templates/> </tbody> </table> </xsl:template> <xsl:template match="SearchResult"> <xsl:variable name="thisRow" select=".//*"></xsl:variable> <tr> <xsl:for-each select="$champs"> <xsl:variable name="thisField" select="local-name(.)"></xsl:variable> <td> <xsl:text> </xsl:text> <xsl:for-each select="$thisRow"> <xsl:if test="$thisField = local-name(.)"> <xsl:value-of select="local-name(.)"/> <xsl:text>=</xsl:text> <xsl:value-of select="."/> </xsl:if> </xsl:for-each> </td> </xsl:for-each> </tr> </xsl:template> ---- Le jeu., 22 avr. 2010 04:27:37 -0400 Robby Pelssers <robby.pelssers@xxxxxxxxx> a C)crit ---- > Sounds easily doable.. > > If you first create the header inside the <output> element in a first transformation till you get result below > > <?xml version="1.0" encoding="ISO-8859-1" ?> > <output> > <thead> > <tr> > <th>OTCreateDate</th> > <th>OTCreatedByFullName</th> > <th>Score</th> > <th>Attr_4539360_16</th> > <th>Attr_4539360_26</th> > </tr> > </thead> > <SearchResults> > <SearchResult> > <OTCreateDate>2009-10-27</OTCreateDate> > <OTCreatedByFullName>Jean-Philippe Martin</OTCreatedByFullName> > <Score>97</Score> > </SearchResult> > <SearchResult> > <Attr_4539360_16>Nord</Attr_4539360_16> > <Attr_4539360_26>TransfC)rer</Attr_4539360_26> > <OTCreateDate >2007-08-30</OTCreateDate> > <OTCreatedByFullName >Caroline</OTCreatedByFullName> > <Score>94</Score> > </SearchResult> > </SearchResults> > </output> > > > Next you process the <output> a second time > > <?xml version="1.0" encoding="UTF-8"?> > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> > <xsl:output method="xml" version="1.0" encoding="UTF-8" > indent="yes" /> > > <xsl:variable name="tableHeaders" select="/output/thead/tr/th" /> > > <xsl:template match="/"> > <xsl:apply-templates select="output" /> > </xsl:template> > > <xsl:template match="output"> > <html> > <body> > <table> > <xsl:apply-templates select="thead" /> > <xsl:apply-templates select="SearchResults" /> > </table> > </body> > </html> > </xsl:template> > > <xsl:template match="SearchResults"> > <tbody> > <xsl:apply-templates select="SearchResult" /> > </tbody> > </xsl:template> > > <xsl:template match="SearchResult"> > <xsl:variable name="result" select="." /> > <tr> > <xsl:for-each select="$tableHeaders"> > <xsl:variable name="header" select="./text()"/> > <td> > <xsl:apply-templates select="$result/*[local-name() = $header]/text()"/> > </td> > </xsl:for-each> > </tr> > </xsl:template> > > > <!-- > copy all nodes and attributes which are not processed by one of > available templates > --> > <xsl:template match="@*|node()"> > <xsl:copy> > <xsl:apply-templates select="@*" /> > <xsl:apply-templates /> > </xsl:copy> > </xsl:template> > > </xsl:stylesheet> > > Cheers, > Robby > > -----Original Message----- > From: jeanph01 [mailto:jeanph01@xxxxxxxx] > Sent: Wednesday, April 21, 2010 10:19 PM > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] XSLT 1.0 : HTML table with > > > I want to create a table with xslt 1.0 from an XML source file containing a varying number of key for each row : > > <?xml version="1.0" encoding="ISO-8859-1" ?> > <output> > <SearchResults> > <SearchResult> > <OTCreateDate>2009-10-27</OTCreateDate> > <OTCreatedByFullName>Jean-Philippe Martin</OTCreatedByFullName> > <Score>97</Score> > </SearchResult> > <SearchResult> > <Attr_4539360_16>Nord</Attr_4539360_16> > <Attr_4539360_26>TransfC)rer</Attr_4539360_26> > <OTCreateDate >2007-08-30</OTCreateDate> > <OTCreatedByFullName >Caroline</OTCreatedByFullName> > <Score>94</Score> > </SearchResult> > </SearchResults> > </output> > > > So here my first key <SearchResult> have 3 sub-keys. But the second <SearchResult> key have 5 sub-keys. I don't know what key will be present in the set since it's a search result. > > This would have to give an html which would look like this with 5 columns: > > <html> > <body> > <table> > <thead> > <tr> > <th>OTCreateDate</th> > <th>OTCreatedByFullName</th> > <th>Score</th> > <th>Attr_4539360_16</th> > <th>Attr_4539360_26</th> > </tr> > </thead> > <tbody> > <tr> > <td>2009-10-27</td> > <td>Jean-Philippe Martin</td> > <td>97</td> > <td></td> > <td></td> > </tr> > <tr> > <td>2007-08-30</td> > <td>Caroline</td> > <td>94</td> > <td>Nord</td> > <td>TransfC)rer</td> > </tr> > </tbody> > </table> > </body> > </html> > > > First, can it be done ? > > For the head row I managed to get the unique key names with a M. Kay algorithm I found but how to link a specific TD to its TH ? > > <xsl:template match="/"> > <table border="1"> > <thead> > <tr> > <xsl:for-each select="//SearchResult/*"> > <xsl:sort select="name(.)"/> > <xsl:if test="generate-id(.) = generate-id(key('names', name(.))[1])"> > <th> > <xsl:value-of select="local-name()"/> > </th> > </xsl:if> > </xsl:for-each> > </tr> > </thead> > </table> > </xsl:template> > > > Thank you for any help.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] XSLT 1.0 : HTML table wit, Robby Pelssers | Thread | [xsl] marking up text when term fro, Hoskins & Gretton |
Re: [xsl] Simple list numbering pro, Jacobus Reyneke | Date | [xsl] grouping issue (part 2), Terry Ofner |
Month |