XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
tera m.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.

Postnext
Ivan PedruzziSubject: 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

Postnext
tera m.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.

Postnext
Ivan PedruzziSubject: 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>

Posttop
tera m.Subject: Thank u!
Author: tera m.
Date: 03 Mar 2005 12:08 AM
Thanks so much for the help!
U r a genius!

Except from some <xsl:text>,</xsl:text> that r missing,
your XSLT does exactly what I'm looking for!! :)

Thanks again,
Tera.

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2016 All Rights Reserved.