Subject: Re: [xsl] Re: HTML table colspec and spanspec problem From: Terry Badger <terry_badger@xxxxxxxxx> Date: Sat, 23 Jan 2010 07:36:56 -0800 (PST) |
Siddhi, This xsl will get close. Needs more work on picking the right alignment based on count. XSL NEW TEMPLATE ADDED AT THE TOP Terry <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:template match="table"> <xsl:result-document href="output.xml"> <table> <tgroup> <xsl:for-each-group select="tbody/tr/td" group-by="."> <!-- FIRST GROUP BY COLUMN NAME --> <xsl:choose> <!-- PICK WHICH TYPE OF SPEC --> <xsl:when test="contains(. , 'and')"> <spanspec> <xsl:attribute name="name"> <xsl:value-of select="substring-before(current-group()[1] , ' and ')"/> <xsl:text>to</xsl:text> <xsl:value-of select="substring-after(current-group()[1] , ' and ')"/> </xsl:attribute> <xsl:attribute name="width"/> <xsl:attribute name="align" select="current-group()[1]/@align"/> <xsl:attribute name="namestart" select="substring-before(current-group()[1] , ' and ')"/> <xsl:attribute name="nameend" select="substring-after(current-group()[1] , ' and ')"/> </spanspec> </xsl:when> <xsl:otherwise> <colspec> <xsl:attribute name="name"> <xsl:value-of select="current-grouping-key()"/> </xsl:attribute> <xsl:attribute name="width"/> <xsl:attribute name="align" select="current-group()[1]/@align"/> </colspec> </xsl:otherwise> </xsl:choose> </xsl:for-each-group> <xsl:apply-templates/> </tgroup> </table> </xsl:result-document> </xsl:template> <xsl:template match="tbody"> <xsl:apply-templates/> </xsl:template> <xsl:template match="tr" mode="abc"> <xsl:if test="preceding::tr[1][child::td[@class='tch']]"> <row> <xsl:apply-templates/> </row> <xsl:apply-templates select="following::tr[1][child::td[@class='tch']]" mode="abc"/> </xsl:if> </xsl:template> <xsl:template match="tr" mode="def"> <xsl:if test="preceding::tr[1][child::td[@class='tbtm']]"> <row> <xsl:apply-templates/> </row> <xsl:apply-templates select="following::tr[1][child::td[@class='tbtm']]" mode="def"/> </xsl:if> </xsl:template> <xsl:template match="tr" mode="xyz"> <xsl:if test="preceding::tr[1][child::td[@class='tb']]"> <row> <xsl:apply-templates/> </row> <xsl:apply-templates select="following::tr[1][child::td[@class='tb']]" mode="xyz"/> </xsl:if> </xsl:template> <xsl:template match="tr"> <xsl:if test="child::td[@class='tch'][not(preceding::tr[1][child::td[@class='tch']])] "> <thead> <row> <xsl:apply-templates/> </row> <xsl:if test="following::*[1][self::tr[child::td[@class='tch']]]"> <xsl:apply-templates select="following::tr[1][child::td[@class='tch']]" mode="abc"/> </xsl:if> </thead> </xsl:if> <xsl:if test="child::td[@class='tbtm'][not(preceding::tr[1][child::td[@class='tbtm']] )]"> <tfoot> <row> <xsl:apply-templates/> </row> <xsl:if test="following::*[1][self::tr[child::td[@class='tbtm']]]"> <xsl:apply-templates select="following::tr[1][child::td[@class='tbtm']]" mode="def"/> </xsl:if> </tfoot> </xsl:if> <xsl:if test="child::td[@class='tb'][not(preceding::tr[1][child::td[@class='tb']])]"> <tbody> <row> <xsl:apply-templates/> </row> <xsl:if test="following::*[1][self::tr[child::td[@class='tb']]]"> <xsl:apply-templates select="following::tr[1][child::td[@class='tb']]" mode="xyz"/> </xsl:if> </tbody> </xsl:if> </xsl:template> <xsl:template match="td"> <entry> <xsl:attribute name="class"> <xsl:value-of select="@class"/> </xsl:attribute> <xsl:if test="@colspan"> <xsl:attribute name="colspan"> <xsl:value-of select="@colspan"/> </xsl:attribute> </xsl:if> <xsl:attribute name="name"> <xsl:text>col</xsl:text> <xsl:if test="not(@colspan)"> <xsl:if test="not(preceding-sibling::td[@colspan])"> <xsl:value-of select="count(preceding-sibling::td)+1"/> </xsl:if> <xsl:if test="preceding-sibling::td[@colspan]"> <xsl:variable name="colspan_values" select="sum(preceding-sibling::td[@colspan]/@colspan)"/> <xsl:variable name="td_number" select="count(preceding-sibling::td)"/> <xsl:variable name="colspan_td_number" select="count(preceding-sibling::td[@colspan])"/> <xsl:value-of select="($td_number+$colspan_values+1) - $colspan_td_number"/> </xsl:if> </xsl:if> <xsl:if test="@colspan"> <xsl:if test="not(preceding-sibling::td[@colspan])"> <xsl:value-of select="count(preceding-sibling::td)+1"/> <xsl:text>to</xsl:text> <xsl:variable name="td_number" select="count(preceding-sibling::td)"/> <xsl:variable name="colspan" select="@colspan"/> <xsl:value-of select="count(preceding-sibling::td)+@colspan"/> </xsl:if> <xsl:if test="preceding-sibling::td[@colspan]"> <xsl:variable name="colspan_values" select="sum(preceding-sibling::td[@colspan]/@colspan)"/> <xsl:variable name="td_number" select="count(preceding-sibling::td)"/> <xsl:variable name="colspan_number" select="count(preceding-sibling::td[@colspan])"/> <xsl:variable name="starting_value"> <xsl:value-of select="($td_number+$colspan_values+1) - $colspan_number"/> </xsl:variable> <xsl:value-of select="$starting_value"/> <xsl:text>to</xsl:text> <xsl:value-of select="($starting_value+@colspan) - 1"/> </xsl:if> </xsl:if> </xsl:attribute> <xsl:apply-templates/> </entry> </xsl:template> <xsl:template match="p"> <p> <xsl:apply-templates/> </p> </xsl:template> </xsl:stylesheet> --~--
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Re: HTML table colspec an, Siddhi Thakkar | Thread | Re: [xsl] Re: HTML table colspec an, Siddhi Thakkar |
Re: [xsl] Re: [MISC] How was the XS, Dave Pawson | Date | Re: [xsl] Just Heard About Symphony, Frederick Yocum |
Month |