473,408 Members | 2,734 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,408 software developers and data experts.

Transforming with XSLT, Grouping elements until difference found.

Transforming with XSLT, Grouping elements until difference found.

I am seeking some help with the following problem, I am fairly new at
XSLT transformations, and my problem may lie in looking at it from a
traditional programming point of view.

I have did quite a bit of searching but have found no answers to my
particular problem... please read below XML for the problem I am
having.

PS: I have no control over the XML I am trying to transform.

--- I have only spaced the lines for clarity ---

<Amounts>
<Amount date="2004-05-30">5290</Amount>
<Amount date="2004-06-30">5290</Amount>

<Amount date="2004-07-30">5300</Amount>
<Amount date="2004-08-30">5300</Amount>

<Amount date="2004-09-30">5290</Amount>
<Amount date="2004-10-30">5290</Amount>
<Amount date="2004-11-30">5290</Amount>

<Amount date="2004-12-30">1000</Amount>

<Amount date="2005-01-30">5290</Amount>

<Amount date="2005-02-28">5300</Amount>

<Amount date="2005-03-30">5290</Amount>
<Amount date="2005-04-30">5290</Amount>

<Amount date="2004-07-30">5300</Amount>
<Amount date="2004-08-30">5300</Amount>
</Amounts>

I am looking to transform the above XML into the below structure
grouping payments with alike ones util there is a different payment
encountered. I also need to inculde a count of the like payments.

Output should look like this: (in the correct order found in the input
stream) I have had limited success with for-each but the problem lies
in the counting of the LIKE elements.

<Payments>
<Payment amount="5290" numpayments="2" />
<Payment amount="5300" numpayments="2" />
<Payment amount="5290" numpayments="3" />
<Payment amount="1000" numpayments="1" />
<Payment amount="5290" numpayments="1" />
<Payment amount="5300" numpayments="1" />
<Payment amount="5290" numpayments="2" />
<Payment amount="5300" numpayments="2" />
</Payments>

Any help would be greatly appreciated.
Jody Greening
jgreening#AT#cyence#DOT#com

Jul 20 '05 #1
5 2145


Jody Greening wrote:
Transforming with XSLT, Grouping elements until difference found.

I am seeking some help with the following problem, I am fairly new at
XSLT transformations, and my problem may lie in looking at it from a
traditional programming point of view.

I have did quite a bit of searching but have found no answers to my
particular problem


Grouping is described here:
<http://www.jenitennison.com/xslt/grouping/index.html>

--

Martin Honnen
http://JavaScript.FAQTs.com/
Jul 20 '05 #2
I have already looked through those examples, but I did not find
anything that can answer my above question. Maybe I am not seeing it,
but there is no example there of what I am trying to accomplish.

I have figured out a way to lop and see if the current value is the
same as the previous, but I am still having the problem of counting
them.

Keep in mind that the outputs here are strictly for testing purposes.

<xsl:template match="Results/Stream[@name='Rents']/Amounts/Amount">
<xsl:for-each select="." >
<xsl:variable name="PreviousAmount"
select="preceding-sibling::Amount[position()=1]" />
<xsl:variable name="CurrentAmount" select="." />
<xsl:choose>
<xsl:when test="scripts:CheckIfNull($CurrentAmount, '0') =
scripts:CheckIfNull($PreviousAmount, '0')">
<TransPaymentInfo>
<xsl:attribute name="TransSubScheduleId">
<xsl:text>Same as last one </xsl:text>
| Current Payment - <xsl:value-of
select="scripts:CheckIfNull($CurrentAmount, 'BLANK')" />
| Previous Payment - <xsl:value-of
select="scripts:CheckIfNull($PreviousAmount, 'BLANK')" />
</xsl:attribute>
</TransPaymentInfo>
</xsl:when>
<xsl:otherwise>
<TransPaymentInfo>
<xsl:attribute name="TransSubScheduleId">
<xsl:text>Different than last one </xsl:text>
| Current Payment - <xsl:value-of
select="scripts:CheckIfNull($CurrentAmount, 'BLANK')" />
| Previous Payment - <xsl:value-of
select="scripts:CheckIfNull($PreviousAmount, 'BLANK')" />
</xsl:attribute>
</TransPaymentInfo>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>

Jul 20 '05 #3
Hi,
I am looking to transform the above XML into the below structure
grouping payments with alike ones util there is a different payment
encountered. I also need to inculde a count of the like payments.


The following sample stylesheet produces the output you want.
<?xml version='1.0' encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:template match="Amounts">
<Payments>
<xsl:apply-templates select="Amount[position()= 1 or . !=preceding::Amount[1]]"/>
</Payments>
</xsl:template>

<xsl:template match="Amount">
<xsl:variable name="count" select="count(following::Amount[. !=current()][1]/preceding::Amount) "/>
<xsl:variable name="cnt">
<xsl:if test="$count =0"><xsl:value-of select="count(../Amount)"/></xsl:if>
<xsl:if test="$count !=0"><xsl:value-of select="$count"/></xsl:if>
</xsl:variable>
<Payment amount="{.}" numpayments="{$cnt - count(preceding::Amount) }" />
</xsl:template>

</xsl:stylesheet>

regards,
--
Joris Gillis (http://www.ticalc.org/cgi-bin/acct-v...i?userid=38041)
Ceterum censeo XML omnibus esse utendum
Jul 20 '05 #4


Jody Greening wrote:
I have already looked through those examples, but I did not find
anything that can answer my above question. Maybe I am not seeing it,
but there is no example there of what I am trying to accomplish.


To group you set up a key, then you can run through the elements, all
explained here
<http://www.jenitennison.com/xslt/grouping/muenchian.html>
To count nodes you use the count function of XPath:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:output method="xml" encoding="UTF-8" indent="yes" />

<xsl:key name="same-amount" match="Amount" use="." />

<xsl:template match="/">
<Payments>
<xsl:for-each select="Amounts/Amount[generate-id() =
generate-id(key('same-amount', .))]">
<Payment amount="{.}" numpayments="{count(key('same-amount', .))}" />
</xsl:for-each>
</Payments>
</xsl:template>

</xsl:stylesheet>

--

Martin Honnen
http://JavaScript.FAQTs.com/
Jul 20 '05 #5
This code (Joris's) works perfectly to organize and count elements in
the way that I explained above.

Thanks :-)

Jul 20 '05 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: Peter Gerstbach | last post by:
Hello, I need help on the new xsl:document element! I'm using XSLT version 1.1 to be able to use the <xsl:document> element, because I need more than 1 output files. I'm using Saxon 6.5.3 My...
3
by: Graham | last post by:
Hi, I am having trouble getting XSL to count the members of a group. What I am trying to do is group by <objectid.Contactid> and count the number of <activityid>'s for each <objectid.contactid>....
5
by: inquirydog | last post by:
Hi- Does anyone know a way to compare whether two nodes contain the same information in xslt (the name, attributes, and all content recursivly should be the same. I am interested in the case...
0
by: Jody Greening | last post by:
Transforming with XSLT, Grouping elements until difference found. I am seeking some help with the following problem, I am fairly new at XSLT transformations, and my problem may lie in looking at...
4
by: Chris Kettenbach | last post by:
Hi Peter, I get error when processing the stylesheet. It errors here. <xsl:for-each select="registration)=1]"> specifically: Expression does not return a DOM node. registration)=1]<--
4
by: Cathie | last post by:
Hi All, I am trying to get my style sheet to work. It works fine in IE but I can't get it to work in .net. Below is the function I use for transforming, where advancedOptionsFile is the path...
3
by: shaun roe | last post by:
mild rant follows Working now for a couple of years with xslt and now xslt 2.0, does anyone else get the impression that xslt 2.0 somehow missed the point? Yes its got a fancy new data model...
6
by: navneet0909 | last post by:
hello, i m new to the enthralling world of xml,xslt so guys pls help. What will be the xsl file of the following.I have an xml input <root> <element name="sam" number="1"/> <element...
2
jkmyoung
by: jkmyoung | last post by:
Here's a short list of useful xslt general tricks that aren't taught at w3schools. Attribute Value Template Official W3C explanation and example This is when you want to put dynamic values...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.