Subject: Re: 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
|