xsl-list
[Top] [All Lists]

RE: summation of attributes

2003-05-27 02:20:17
Hi,
 
I am having a fop document that has to be transferred to 
html. Right now I am struugling with the following situation. 
 
fop.xml : 
 
*snip* 
<fo:table width="100%"> 
 
      <fo:table-column column-width="proportional-column-width(68)"/> 
      <fo:table-column column-width="proportional-column-width(95)"/> 
 
      .... continued .... 
 
</fo:table> 
*snip> 
 
this has to be transferred to 
 
<table> 
      <colgroup> 
              <col width="41%"/>     <!-- 68 * 100 / (68 + 95) --> 
              <col width="59%"/>     <!-- 95 * 100 / (68 + 95) --> 
      </colgroup> 
 
    .. continued ... 
</table> 

Erm... I suppose you have a good reason for it, but why on earth are you 
transforming FO to HTML?
  
right know I am using the following templates 
 
<xsl:template match="fo:table"> 
      <table> 
              <xsl:variable name="summated_attributes" 
select="sum(fo:table-column/ @column-width)"/> 
              <colgroup> 
                      <xsl:apply-templates match="fo:table-column"> 

xsl:apply-templates doesn't have a match attribute--you want select.

[snip]

              <xsl:attribute name="width" 
select="@column-width * 100 div $total_sum">%</xsl:attribute> 

xsl:attribute doesn't have select attribute. Use containing xsl:value-of.

unfortunatly column-width is encoded as 
"proportinal-column-with(68)" where 68 is the value I need 
therefore I am also doing 
 
<xsl:template match="@column-width"> 
      <xsl:value-of select="substring(., 27,2)"/> 
</xsl:template> 

Which would give you the valua, but the above 

  @column-width * 100 div $total_sum

Expression will not apply the template for @column-witdth, but rather just 
first retrieves the string value of @column-witdth and then casts that to a 
number. You need to call xsl:apply-templates explicitly inside an xsl:variable 
to use the template.
  
_but this is not working_ 
 
does anybody have an idea ? 

For example

  <xsl:template match="fo:table">
    <table>
      <colgroup>
        <xsl:apply-templates select="fo:table-column">
          <xsl:with-param name="total_sum">
            <xsl:call-template name="sum">
              <xsl:with-param name="node-set" 
select="fo:table-column/@column-width"/>
            </xsl:call-template>
          </xsl:with-param>
        </xsl:apply-templates>
      </colgroup>
    </table>
  </xsl:template>
  <xsl:template match="fo:table-column">
    <xsl:param name="total_sum"/>
    <xsl:variable name="width">
      <xsl:apply-templates select="@column-width"/>
    </xsl:variable>
    <col width="{round($width * 100 div $total_sum)}%"/>
  </xsl:template>
  <xsl:template match="@column-width">
    <xsl:value-of select="substring(., 27,2)"/>
  </xsl:template>
  <!--recursive template to calculate the sum of @column-width values-->
  <xsl:template name="sum">
    <xsl:param name="node-set" select="/.."/>
    <xsl:param name="sum" select="0"/>
    <xsl:choose>
      <xsl:when test="$node-set">
        <xsl:variable name="width">
          <xsl:apply-templates select="$node-set[1]"/>
        </xsl:variable>
        <xsl:call-template name="sum">
          <xsl:with-param name="node-set" select="$node-set[not(position() = 
1)]"/>
          <xsl:with-param name="sum" select="$sum + $width"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$sum"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Cheers,

Jarno - SITD: Mortal (RMX by Solitary Experiments)

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



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