|
next
|
 Subject: special xsl transformation Author: tera m. Date: 24 Feb 2005 07:27 AM
|
Hi everyone,
i would like to know how can i do a special xsl transformation.
for example, if my XML file is:
********************************
<?xml version="1.0"?>
<root>
<row>
<field>
<name>Identity</name>
<value>10.0</value>
</field>
<field>
<name>Sumary</name>
<value>1700.0</value>
</field>
<field>
<name>Tax Type</name>
<value>G</value>
</field>
<field>
<name>Tax Sum</name>
<value>160.0</value>
</field>
<field>
<name>Date</name>
<value>Fri Feb 04 00:00:00 IST 2005</value>
</field>
</row>
<row>
<field>
<name>Identity</name>
<value>10.0</value>
</field>
<field>
<name>Sumary</name>
<value>900.0</value>
</field>
<field>
<name>Tax Type</name>
<value>H</value>
</field>
<field>
<name>Tax Sum</name>
<value>90.0</value>
</field>
<field>
<name>Date</name>
<value>Fri Feb 04 00:00:00 IST 2005</value>
</field>
</row>
<row>
<field>
<name>Identity</name>
<value>10.0</value>
</field>
<field>
<name>Sumary</name>
<value>800.0</value>
</field>
<field>
<name>Tax Type</name>
<value>P</value>
</field>
<field>
<name>Tax Sum</name>
<value>53.0</value>
</field>
<field>
<name>Date</name>
<value>Fri Feb 04 00:00:00 IST 2005</value>
</field>
</row>
<row>
<field>
<name>Identity</name>
<value>20.0</value>
</field>
<field>
<name>Sumary</name>
<value>41.0</value>
</field>
<field>
<name>Tax Type</name>
<value>P</value>
</field>
<field>
<name>Tax Sum</name>
<value>4.0</value>
</field>
<field>
<name>Date</name>
<value>Fri Dec 02 00:00:00 IST 2005</value>
</field>
</row>
<row>
<field>
<name>Identity</name>
<value>20.0</value>
</field>
<field>
<name>Sumary</name>
<value>91.0</value>
</field>
<field>
<name>Tax Type</name>
<value>Q</value>
</field>
<field>
<name>Tax Sum</name>
<value>9.0</value>
</field>
<field>
<name>Date</name>
<value>Fri Dec 02 00:00:00 IST 2005</value>
</field>
</row>
<row>
<field>
<name>Identity</name>
<value>30.0</value>
</field>
<field>
<name>Sumary</name>
<value>200.0</value>
</field>
<field>
<name>Tax Type</name>
<value>H</value>
</field>
<field>
<name>Tax Sum</name>
<value>35.0</value>
</field>
<field>
<name>Date</name>
<value>Sat Apr 10 00:00:00 IDT 2004</value>
</field>
</row>
<row>
<field>
<name>Identity</name>
<value>30.0</value>
</field>
<field>
<name>Sumary</name>
<value>200.0</value>
</field>
<field>
<name>Tax Type</name>
<value>P</value>
</field>
<field>
<name>Tax Sum</name>
<value>20.0</value>
</field>
<field>
<name>Date</name>
<value>Sat Apr 10 00:00:00 IDT 2004</value>
</field>
</row>
<row>
<field>
<name>Identity</name>
<value>40.0</value>
</field>
<field>
<name>Sumary</name>
<value>1540.0</value>
</field>
<field>
<name>Tax Type</name>
<value>G</value>
</field>
<field>
<name>Tax Sum</name>
<value>412.0</value>
</field>
<field>
<name>Date</name>
<value>Tue Aug 31 00:00:00 IDT 2004</value>
</field>
</row>
</root>
And i wanna transform it to a text file of this format:
"indentity,max Sumary,G Tax Sum,H Tax Sum,P Tax Sum,Q Tax Sum,Date"
For example:
10.0,1700.0,160.0,90.0,53.0,,04022005
20.0,91.0,,,4.0,9.0,02122005
.
.
.
Notice that when a Tax Type doen't appear in an Identity,
his value will b ,, in the Text file.
Also: the max Sumary is taken for each Identity.
How can i do all of that?
Is that easier to do it with 2 XSL stylesheets?
Any help will be welcome...
Thank you for helping,
Tera.
|
next
|
 Subject: special xsl transformation Author: Ivan Pedruzzi Date: 24 Feb 2005 04:17 PM
|
You are trying to transform XML to CSV.
The topic has been repeatedly discussed on this forum
The following XSLT is yet another example
Hope this helps
Ivan
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="root/row[1]/field">
<xsl:value-of select="name"/>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each><xsl:text>
</xsl:text>
<xsl:apply-templates select="/root/row"/>
</xsl:template>
<xsl:template match="row">
<xsl:apply-templates select="field"/><xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="field">
<xsl:apply-templates select="value"/>
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="value">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Identity, Sumary, Tax Type, Tax Sum, Date
10.0, 1700.0, G, 160.0, Fri Feb 04 00:00:00 IST 2005
10.0, 900.0, H, 90.0, Fri Feb 04 00:00:00 IST 2005
10.0, 800.0, P, 53.0, Fri Feb 04 00:00:00 IST 2005
20.0, 41.0, P, 4.0, Fri Dec 02 00:00:00 IST 2005
20.0, 91.0, Q, 9.0, Fri Dec 02 00:00:00 IST 2005
30.0, 200.0, H, 35.0, Sat Apr 10 00:00:00 IDT 2004
30.0, 200.0, P, 20.0, Sat Apr 10 00:00:00 IDT 2004
40.0, 1540.0, G, 412.0, Tue Aug 31 00:00:00 IDT 2004
|
next
|
 Subject: to Ivan, and for everyone else who can help... Author: tera m. Date: 26 Feb 2005 01:15 PM
|
Hi,
thanks for trying to help me,
but I still have problems with my issue.
I guess i didn't explain myself very well,
so I'm gonna try to do it better know:
I don't know exactly what is CSV,
but it doesn't seemed to b what i want.
What i want is a text file of this format:
Identity,Sumary,TaxSum of G TaxType,TaxSum of H TaxType,TaxSum of P TaxType,TaxSum of Q TaxType,TaxSum,Date
Meaning-
1. For every "Identity" there is only 1 line matching (on the final text file).
2. The Taxes Types won't appear on the final file, only their Sum.
For every line (=1 Identity)-
all the Taxes Sums related to that Identity will be written on that line.
3. If one of the Identity doen't have one of the Tax Type,
the sum of this tax will be written as nothing.
For example-
the Identity 10.0 doesn't have a Q tax,
so it's line will b like this:
10.0,1700.0,160.0,90.0,53.0,,04022005
*The final file will be:
10.0,1700.0,160.0,90.0,53.0,,04022005
20.0,91.0,,,4.0,9.0,02122005
30.0,200.0,,35.0,20.0,,10042004
40.0,1540.0,412.0,,,,31082004
Btw, I would like also the date to b as written below DDMMYYYY,
only if that's possible.
Thank You very much!!
Every help is welcome!
Tera.
|
next
|
 Subject: to Ivan, and for everyone else who can help... Author: Ivan Pedruzzi Date: 27 Feb 2005 11:02 PM
|
I see, try the following
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="Identity" match="root/row" use="field[name='Identity']/value"/>
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:for-each select="/root/row">
<xsl:variable name="group" select="key('Identity', field[name='Identity']/value)"/>
<xsl:if test="generate-id(.) = generate-id($group[1])">
<!-- Indentity -->
<xsl:value-of select="field[name='Identity']/value"/>
<!-- Sumary -->
<xsl:text> </xsl:text>
<xsl:call-template name="max">
<xsl:with-param name="nodeset" select="$group/field[name='Sumary']/value"/>
</xsl:call-template>
<!-- TaxSum of G TaxType -->
<xsl:text>, </xsl:text>
<xsl:value-of select="$group/field[name='Tax Type' and value='G']/value/../../field[name='Tax Sum']/value"/>
<!-- TaxSum of H TaxType -->
<xsl:text>, </xsl:text>
<xsl:value-of select="$group/field[name='Tax Type' and value='H']/value/../../field[name='Tax Sum']/value"/>
<!-- TaxSum of P TaxType -->
<xsl:text>, </xsl:text>
<xsl:value-of select="$group/field[name='Tax Type' and value='P']/value/../../field[name='Tax Sum']/value"/>
<!-- TaxSum of Q TaxType -->
<xsl:text>, </xsl:text>
<xsl:value-of select="$group/field[name='Tax Type' and value='Q']/value/../../field[name='Tax Sum']/value"/>
<!-- Date -->
<xsl:text>, </xsl:text>
<xsl:call-template name="format-date">
<xsl:with-param name="date" select="field[name='Date']/value"/>
</xsl:call-template>
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name="max">
<xsl:param name="max" select="0"/>
<xsl:param name="nodeset"/>
<xsl:param name="index" select="1"/>
<xsl:variable name="newmax">
<xsl:choose>
<xsl:when test="$nodeset[$index] > $max">
<xsl:value-of select="$nodeset[$index]"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$max"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:if test="$nodeset[$index+1]">
<xsl:call-template name="max">
<xsl:with-param name="max" select="$newmax"/>
<xsl:with-param name="nodeset" select="$nodeset"/>
<xsl:with-param name="index" select="$index+1"/>
</xsl:call-template>
</xsl:if>
<xsl:if test="count($nodeset) = $index">
<xsl:value-of select="$newmax"/>
</xsl:if>
</xsl:template>
<xsl:template name="format-date">
<xsl:param name="date"/>
<xsl:value-of select="substring($date, 9, 2)"/>
<xsl:variable name="month" select="substring($date, 5, 3)"/>
<xsl:choose>
<xsl:when test="$month = 'Jan'">01</xsl:when>
<xsl:when test="$month = 'Feb'">02</xsl:when>
<xsl:when test="$month = 'Mar'">03</xsl:when>
<xsl:when test="$month = 'Apr'">04</xsl:when>
<xsl:when test="$month = 'May'">05</xsl:when>
<xsl:when test="$month = 'Jun'">06</xsl:when>
<xsl:when test="$month = 'Jul'">07</xsl:when>
<xsl:when test="$month = 'Aug'">08</xsl:when>
<xsl:when test="$month = 'Sep'">09</xsl:when>
<xsl:when test="$month = 'Oct'">10</xsl:when>
<xsl:when test="$month = 'Nov'">11</xsl:when>
<xsl:when test="$month = 'Dec'">12</xsl:when>
</xsl:choose>
<xsl:value-of select="substring($date, string-length($date)-3)"/>
</xsl:template>
</xsl:stylesheet>
|
|
|
|