xsl-list
[Top] [All Lists]

Re: xslt 2.0 challenge

2004-04-08 05:56:13
  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=(_at_)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[(_at_)colname=$start] or 
preceding-sibling::colspec[(_at_)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
________________________________________________________________________


<Prev in Thread] Current Thread [Next in Thread>