[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: xslt 2.0 challenge
My xslt 1.0 solution uses 3 temporary trees and a recursive template to remove the 'mm' and sum the correct <colspec>'s respectively. This still seems to run pretty fast, but I'm hoping to do away with it using the new features in 2.0. Here's a one-pass XSLT1 solution. <tgroup cols="4"> <colspec colname="C.HNL" colnum="1" colwidth="55mm" align="LEFT"/> <colspec colname="C.HNK" colnum="2" colwidth="32mm" align="CENTER"/> <colspec colname="C.HNJ" colnum="3" colwidth="33mm" align="CENTER"/> <colspec colname="C.HNI" colnum="4" colwidth="49mm" align="CENTER"/> <spanspec spanname="S.HOJ" namest="C.HNG" nameend="C.HNF" rowsep="1"/> <thead> <colspec colname="C.HNH" colnum="1" colwidth="55mm" align="LEFT"/> <colspec colname="C.HNG" colnum="2" colwidth="32mm" align="CENTER"/> <colspec colname="C.HNF" colnum="3" colwidth="33mm" align="CENTER"/> <colspec colname="C.HNE" colnum="4" colwidth="49mm" align="CENTER"/> </thead> </tgroup> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="spanspec"> <xsl:apply-templates mode="s" select="ancestor::tgroup//*[colspec[current()/@namest=@colname]]/colspec[1]"> <xsl:with-param name="start" select="@namest"/> <xsl:with-param name="end" select="@nameend"/> </xsl:apply-templates> </xsl:template> <xsl:template mode="s" match="colspec"> <xsl:param name="start" select="/.."/> <xsl:param name="end" select="/.."/> <xsl:param name="totala" select="0"/> <xsl:param name="totalb" select="0"/> <xsl:variable name="w" select="translate(@colwidth,'m','')"/> <xsl:choose> <xsl:when test="following-sibling::colspec[@colname=$start] or preceding-sibling::colspec[@colname=$end]"> <xsl:apply-templates mode="s" select="following-sibling::colspec[1]"> <xsl:with-param name="start" select="$start"/> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="totala" select="$totala"/> <xsl:with-param name="totalb" select="$totalb+$w"/> </xsl:apply-templates> <xsl:if test="not(following-sibling::colspec)"> [ <xsl:value-of select="format-number(100*($totala) div ($totalb + $w),'#.##')"/>% ] </xsl:if> </xsl:when> <xsl:otherwise> <xsl:apply-templates mode="s" select="following-sibling::colspec[1]"> <xsl:with-param name="start" select="$start"/> <xsl:with-param name="end" select="$end"/> <xsl:with-param name="totala" select="$totala+$w"/> <xsl:with-param name="totalb" select="$totalb+$w"/> </xsl:apply-templates> <xsl:if test="not(following-sibling::colspec)"> [ <xsl:value-of select="format-number(100*($totala + $w) div ($totalb + $w),'#.##')"/>% ] </xsl:if> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> $ saxon spanspec.xml spanspec.xsl <?xml version="1.0" encoding="utf-8"?> [ 38.46% ] -- http://www.dcarlisle.demon.co.uk/matthew ________________________________________________________________________ This e-mail has been scanned for all viruses by Star Internet. The service is powered by MessageLabs. For more information on a proactive anti-virus service working around the clock, around the globe, visit: http://www.star.net.uk ________________________________________________________________________
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|