|
Subject: [xsl] conditional multiline output From: "Erwin Kloeck" <kloeck@xxxxxxxxx> Date: Tue, 6 Feb 2007 10:44:30 +0100 |
A week ago a posted the following problem and Abel Braaksma was kind enough to to give it some consideration.
I have in the meantime come up with a solution and would like to solicit your comments on how to make it more simple and clear. There is a real question here as well: Where does the space in front of the closing bracket come from and how do I get rid of it?
Here is my solution (I omitted the header line) and I appended my original problem:
--- begin example.xsl ---
<?xml version="1.0" encoding="UTF-8"?>
<?altova_samplexml C:\workspaces\tmp\xsl\example.xml?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:xs="http://www.w3.org/2001/XMLSchema"><xsl:variable name="delimiter" select="'; '" /> <xsl:variable name="newline" select="' '" />
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template> <xsl:variable name="this" select="." />
<xsl:variable name="dates" select="distinct-values(date/@value)" /> <xsl:variable name="max-count" >
<xsl:value-of select="max(for $date in $dates return
count(date[@value = $date]))" />
</xsl:variable> <xsl:for-each select="(1 to $max-count)" >
<xsl:variable name="i" select="." />
<xsl:value-of select="$this/@value" />
<xsl:value-of select="$delimiter" />
<xsl:for-each-group select="$this/date" group-by="@value" >
<xsl:if test="current-group()[$i]/@string" >
<xsl:value-of
select="concat(current-group()[$i]/@string, ' [',
current-group()[$i]/@count), ']'" />
</xsl:if>
<xsl:value-of select="$delimiter" />
</xsl:for-each-group> <xsl:value-of select="$newline" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
--- end example.xsl ---
I have a list of date elements in my xml that I want to output in columns in a csv file. If the same date occurs more than once, I want another line in the respective column and the label in the first column.
I think I should group the dates and then cicle thru and output the line with all 1st elements in the group, then all 2nd elements in the second line etc.
--- begin example.xml --- <?xml version="1.0" encoding="UTF-8"?> <top> <logpoint value="AAA" > <date value="2007-01-01" count="1" string="aaa"/> <date value="2007-01-01" count="11" string="xxx"/> <date value="2007-01-02" count="2" string="bbb"/> <date value="2007-01-03" count="3" string="ccc"/> <date value="2007-01-03" count="4" string="ddd"/> <date value="2007-01-03" count="41" string="yyy"/> <date value="2007-01-04" count="5" string="eee"/> </logpoint> <logpoint value="BBB" > <date value="2007-01-01" count="31" string="lll"/> <date value="2007-01-02" count="32" string="mmm"/> <date value="2007-01-03" count="33" string="nnn"/> <date value="2007-01-04" count="34" string="ooo"/> </logpoint> </top> --- begin example.xml ---
desired output: --- begin example.csv --- logpoint;2007-01-01;2007-01-02;2007-01-03;2007-01-04; AAA;aaa[1];bbb[2];ccc[3];eee[5]; AAA;xxx[11];;ddd[4];; AAA;;;yyy[41];; BBB;lll[31];mmm[32];nnn[33];ooo[34]; --- end example.csv ---
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] XSL-FO Question - fo:retr, McDonald, Shaun | Thread | Re: [xsl] conditional multiline out, Owen Rees |
| Re: [xsl] 99 bottles of beer, Andrew Welch | Date | [xsl] XSL-FO: Centering text vertic, Chris Graham [WarpSp |
| Month |