Re: [xsl] Problem with count iterate values

Subject: Re: [xsl] Problem with count iterate values
From: J23 <duniaj@xxxxxxxxxxxx>
Date: Sat, 19 Sep 2009 21:45:41 +0200
Hello
I do not know the difference, but it seems that I can not use this header:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:exsl="http://exslt.org/common";
exclude-result-prefixes="exsl"
version="1.0">
Tag form template David Carlisle:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
               xmlns:exslt="http://exslt.org/common";
               version="1.0">
was accepted but this one in my system display nothing. His template
works correctly.  My system don't support exslt well. I wonder if it
is a question of this declaration or  function of exsl which you used.
I don't know which may be reason of this problem.

Static columns are OK. I lost many hours trying to make recursive
columns, and it is quite good idea for this problem.
Kind regards.

2009/9/19 Martin Honnen <Martin.Honnen@xxxxxx>:
> J23 wrote:
>
>> xml input:
>> <?xml version="1.0"?>
>> <?xml-stylesheet href="xsl.xsl" type="text/xsl" ?>
>> <elements>
>>        <Row Nr="1">
>>                <name>Mark</name>
>>                <value>1</value>
>>                <code>22</code>
>>        </Row>
>>        <Row Nr="2">
>>                <name>Mark</name>
>>                <value>1</value>
>>                <code>1</code>
>>        </Row>
>>
>>        <Row Nr="3">
>>                <name>Paul</name>
>>                <value>2</value>
>>                <code>2</code>
>>        </Row>
>>        <Row Nr="4">
>>                <name>Mark</name>
>>                <value>1</value>
>>                <code>2</code>
>>        </Row>
>>        <Row Nr="5">
>>                <name>Peter</name>
>>                <value>44</value>
>>                <code>2</code>
>>        </Row>
>>        <Row Nr="6">
>>                <name>Peter</name>
>>                <value>1</value>
>>                <code>0</code>
>>        </Row>
>>        <Row Nr="7">
>>                <name>Paul</name>
>>                <value>11</value>
>>                <code>1</code>
>>        </Row>
>>        <Row Nr="8">
>>                <name>Peter</name>
>>                <value>11</value>
>>                <code>1</code>
>>        </Row>
>>        <Row Nr="9">
>>                <name>Mark</name>
>>                <value>13</value>
>>                <code>0</code>
>>        </Row>
>>        <Row Nr="10">
>>                <name>Peter</name>
>>                <value>13</value>
>>                <code>1</code>
>>        </Row>
>>        <Row Nr="11">
>>                <name>Paul</name>
>>                <value>14</value>
>>                <code>1</code>
>>        </Row>
>> </elements>
>
> The following stylesheet
>
> <xsl:stylesheet
>  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>  xmlns:exsl="http://exslt.org/common";
>  exclude-result-prefixes="exsl"
>  version="1.0">
>
>  <xsl:output method="html" indent="yes"/>
>
>  <xsl:key name="k1" match="Row[not(code = 0)]" use="name"/>
>  <xsl:key name="k2" match="Row[not(code = 0)]" use="concat(name, '|',
> value)"/>
>  <xsl:key name="k3" match="data" use="concat(../@key, '|', @count)"/>
>
>  <xsl:variable name="cols-rtf">
>    <td>1</td>
>    <td>2</td>
>    <td>3</td>
>    <td>4</td>
>    <td>5</td>
>  </xsl:variable>
>
>  <xsl:variable name="cols" select="exsl:node-set($cols-rtf)/td"/>
>
>  <xsl:template match="/">
>    <html>
>      <head>
>        <title>Example</title>
>      </head>
>      <body>
>        <xsl:variable name="groups-rtf">
>          <xsl:for-each select="elements/Row[not(code = 0)][generate-id() =
> generate-id(key('k1', name)[1])]">
>            <group key="{name}">
>              <xsl:for-each select="key('k1', name)[generate-id() =
> generate-id(key('k2', concat(name, '|', value))[1])]">
>                <xsl:sort select="count(key('k2', concat(name, '|',
value)))"
> data-type="number"/>
>                <data value="{value}" count="{count(key('k2', concat(name,
> '|', value)))}"/>
>              </xsl:for-each>
>            </group>
>          </xsl:for-each>
>        </xsl:variable>
>        <xsl:variable name="groups"
> select="exsl:node-set($groups-rtf)/group"/>
>        <table border="1">
>          <thead>
>            <tr>
>              <th>Name</th>
>              <th colspan="{count($cols)}">Values repeated n time(s)</th>
>            </tr>
>            <tr>
>              <th></th>
>              <xsl:copy-of select="$cols"/>
>            </tr>
>          </thead>
>          <tbody>
>            <xsl:for-each select="$groups">
>              <xsl:variable name="cg" select="."/>
>              <tr>
>                <td><xsl:value-of select="@key"/></td>
>                <xsl:for-each select="$cols">
>                  <xsl:variable name="col" select="."/>
>                  <td>
>                    <xsl:for-each select="$cg">
>                      <xsl:variable name="dg" select="key('k3', concat(@key,
> '|', $col))"/>
>                      <xsl:choose>
>                        <xsl:when test="$dg">
>                          <xsl:value-of select="count($dg)"/>
>                          <xsl:text> (values </xsl:text>
>                          <xsl:for-each select="$dg">
>                            <xsl:value-of select="@value"/>
>                            <xsl:if test="position() != last()">
>                              <xsl:text>, </xsl:text>
>                            </xsl:if>
>                          </xsl:for-each>
>                          <xsl:text>)</xsl:text>
>                        </xsl:when>
>                        <xsl:otherwise>0</xsl:otherwise>
>                      </xsl:choose>
>                    </xsl:for-each>
>                  </td>
>                </xsl:for-each>
>              </tr>
>            </xsl:for-each>
>          </tbody>
>        </table>
>      </body>
>    </html>
>  </xsl:template>
>
> </xsl:stylesheet>
>
> produces the following result:
>
> <html>
>   <head>
>      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
>
>      <title>Example</title>
>   </head>
>   <body>
>      <table border="1">
>         <thead>
>            <tr>
>               <th>Name</th>
>               <th colspan="5">Values repeated n time(s)</th>
>            </tr>
>            <tr>
>               <th></th>
>               <td>1</td>
>               <td>2</td>
>               <td>3</td>
>               <td>4</td>
>               <td>5</td>
>            </tr>
>         </thead>
>         <tbody>
>            <tr>
>               <td>Mark</td>
>               <td>0</td>
>               <td>0</td>
>               <td>1 (values 1)</td>
>               <td>0</td>
>               <td>0</td>
>            </tr>
>            <tr>
>               <td>Paul</td>
>               <td>3 (values 2, 11, 14)</td>
>               <td>0</td>
>               <td>0</td>
>               <td>0</td>
>               <td>0</td>
>            </tr>
>            <tr>
>               <td>Peter</td>
>               <td>3 (values 44, 11, 13)</td>
>               <td>0</td>
>               <td>0</td>
>               <td>0</td>
>               <td>0</td>
>            </tr>
>         </tbody>
>      </table>
>   </body>
> </html>
>
> I hope that reflects what you want to achieve.
> I cheated however by putting five columns statically in the stylesheet. If
> you expect more repetitions than five then you would either need to edit
the
> stylesheet to add as much as you expect or you will need to implement some
> column generation first based on the maximum count the stylesheet finds.
>
>
>
> --
>
>        Martin Honnen
>        http://msmvps.com/blogs/martin_honnen/
>
>



--
Pozdrawiam
Jacek Dunia

Current Thread