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
Conferences Close Tree View
+ Stylus Studio Feature Requests (1192)
+ Stylus Studio Technical Forum (14621)
+ Website Feedback (249)
- XSLT Help and Discussion (7625)
-> + How to add page number in to v... (2)
-> + XSL Grouping (7)
-> + Repeat images using FOR EACH l... (7)
-> + How to get File name (2)
-> + image and text on the same lin... (2)
-> + Create XSLT stylesheets for us... (2)
-> + Merge Multiple Files While Che... (2)
-> + xslt 3 level or multi level gr... (6)
-> + How to create xsl which will c... (2)
-> + xsl:variable and Result Tree F... (7)
-> - XSL-FO fo:table continued from... (1)
-> + XSLT Java issue (2)
-> + problem with hyperlink (4)
-> + substring-after function probl... (4)
-> + Xalan Processing (3)
-> + Memory utilization high with m... (2)
-> + check all parent node groups s... (2)
-> + CSV DOC to XML CONVERSION (11)
-> + XSLT: Ordered List (based on r... (4)
-> + XSLT Mapping - Issue (4)
-> + XSL following-sibling, how to ... (5)
-> + need xslt elements help (2)
-> + Dynamic generation of URL in X... (2)
-> + List Created from Section Navi... (2)
-> + xslt elements help (2)
-> + Map field if source is not nul... (3)
-> + XSLT group and sort whith gene... (4)
-> + Nested XML value (2)
-> + Specifying condition with coun... (4)
-> + xsl:function using found in er... (4)
-> + How to remove an unwanted spac... (2)
-> + Question about variable substi... (2)
-> + XSL for Comparing nodes and di... (4)
-> + External lookup list (8)
-> + XSL HTML output now needs to b... (2)
-> + Adding a new sub element to th... (4)
-> + How do I get rid of 'Tip' node... (9)
-> + Trying to dynamically create n... (2)
-> + Display XML link, using XSLT a... (9)
-> + calling templates based on ord... (2)
-> + How to add internal links usin... (4)
-> + How to call user defined java ... (3)
-> + XSLT and WebApps past and futu... (3)
-> + passing condition through java... (3)
-> + Apllying a template from withi... (4)
-> + Getting xsl element in javascr... (3)
-> + The document() function inside... (3)
-> + Footnote text move to para (2)
-> + XSL: multiple element come to ... (3)
-> + How to use following-sibling &... (2)
-> + How to use FOP 0.95 with Stylu... (4)
-> + Error during creating PDF from... (2)
-> + Help creating a comma delimite... (4)
-> + Selective Add using XSLT recur... (3)
-> + Help: convert without parent e... (2)
-> - Correct my substring function ... (1)
-> + Old xsl into reports (4)
-> + How to save xslt converted fil... (3)
-> + How to find non tagging text? (5)
-> + Help: Hex entity to Character... (6)
-> + EDI QUOTES MESSAGE NEED TO REP... (2)
-> + How to convert in multi level ... (4)
-> + Need some help with a styleshe... (3)
-> - Conditional Formattinf Formula... (1)
-> + Creating HTML Unordered LIsts.... (2)
-> + xslt params uknown number of i... (2)
-> + How to use fonts other than ba... (2)
-> - Converting existing HTML into ... (1)
-> + Help to tune up this XSLT (2)
-> + XSLT - is only converting the ... (2)
-> + XSLT Editor tab (4)
-> + Convert multiple files from XM... (2)
-> + how to use in select expressi... (2)
-> + Help needed in XSL transformat... (2)
-> + How to add a string with math ... (5)
-> + How to add a string with math ... (6)
-> - br element (1)
-> + Stylesheet directed terminatio... (2)
-> + Who can help me whit sum funct... (2)
-> + XSLT Works in Stylus Studio, n... (3)
-> - Filter by Attribute (1)
-> + Display x number of items whic... (6)
-> + MultiColumn Reporting (3)
-> + cant get namespace declaration... (3)
-> + Performance xsl:for each and n... (3)
-> + How to assign value to a XSLT ... (3)
-> + Select element value based on ... (2)
-> + Version 10 of Saxon? (8)
-> + How to get the value of a node... (5)
-> + Display Xpath using (4)
-> + XSLT to report (2)
-> + xslt help for a noobie (2)
-> + XSL-FO XML to PDF with XSLT (3)
-> + Using XSLT to transform XML to... (4)
-> + XSLT to sort a list alphabetic... (4)
-> + How to Get Colum Values based ... (2)
-> + non persisting predicate filte... (5)
-> + HTML to XSLT (2)
-> + extra carriage returns in "csv... (2)
-> + extra carriage returns in "csv... (3)
-- Previous [301-320] [321-340] [341-360] Next
+ XQuery Help and Discussion (2017)
+ Stylus Studio FAQs (159)
+ Stylus Studio Code Samples & Utilities (364)
+ Stylus Studio Announcements (113)
Topic  
Postnext
N TSubject: Sorting XSL and limiting only first n elements
Author: N T
Date: 01 Aug 2005 02:47 PM
I have an XML document that have about 200 nodes that look roughly like this:

<root>
<news>
<industry>Aerospace</industry>
<lastupdated>7/28/2005 12:01:00 AM</lastupdated>
<title>News from aerospace</title>
</news>
<news>
<industry>Mechanical</industry>
<lastupdated>6/28/2004 12:01:00 AM</lastupdated>
<title>News from mechanical</title>
</news>
<news>
<industry>Aerospace</industry>
<lastupdated>4/2/2002 12:01:00 PM</lastupdated>
<title>News from aerospace</title>
</news>
<news>
<industry>Electrical</industry>
<lastupdated>3/8/2005 12:01:00 AM</lastupdated>
<title>News from electrical</title>
</news>
<news>
<industry>Computer Science</industry>
<lastupdated>3/28/2002 12:01:00 AM</lastupdated>
<title>News from CS</title>
</news>
<news>
<industry>Aerospace</industry>
<lastupdated>4/28/2005 12:01:00 AM</lastupdated>
<title>News from aerospace</title>
</news>
</root>


I need to sort these nodes where industry is Aerospace or Electrical (for example), sort them by lastupdated (reverse chronological). I am able to do that so far successfully. Its just that I need to display the top 2 items (of the 3 or more that are selected). How do I accomplish that? I cannot use the position(), because it relates to the nodes in the document, not the position of nodes after sort.

Here is the XSL:

<xsl:template match="/">
<xsl:for-each select="root/news">
<!-- lastupdated is MM/DD/YYYY HH:MI:SS XM e.g. 7/27/2005 4:12:22 PM -->
<xsl:sort order="descending" data-type="number" select='substring-after(substring-after(substring-before(LASTUPDATED, " "), "/"), "/")'></xsl:sort>
<!-- sort the yyyy as number -->
<xsl:sort order="descending" data-type="number" select='substring-before(substring-before(LASTUPDATED, " "), "/")'></xsl:sort>
<!-- sort MM as number -->
<xsl:sort order="descending" data-type="number" select='substring-after(substring-before(LASTUPDATED, " "), "/")'></xsl:sort>
<!-- sort date as number -->
<xsl:sort order="descending" select='substring-after(substring-after(LASTUPDATED, " "), " ")'></xsl:sort>
<!-- within day, sort XM (AM/PM) as string, PM first -->
<xsl:sort order="descending" data-type="number" select='substring-before(substring-after(LASTUPDATED, " "), ":")'></xsl:sort>
<!-- sort the HH as number -->
<xsl:sort order="descending" data-type="number" select='substring-before(substring-after(substring-after(LASTUPDATED, " "), ":"), ":")'></xsl:sort>
<!-- sort the MM as number -->
<!-- The one problem currently with this approach is that 12:20 AM will be considered latest when compared to 9:20 AM -->

<xsl:if test="industry/text() = 'Aerospace' or
industry/text() = 'Electrical'
">
<!-- <xsl:if test="position() &lt; 2"> -->

<tr><td>


||<xsl:value-of select='concat(substring-before(substring-after(LASTUPDATED, " "), ":"), ":", substring-before(substring-after(substring-after(LASTUPDATED, " "), ":"), ":"), " ", substring-after(substring-after(LASTUPDATED, " "), " "), " ET, ", substring-before(LASTUPDATED, " "))' />
</td></tr>

<tr><td>
<xsl:value-of select="title"/>
</td></tr>
<!-- </xsl:if> -->
</xsl:if>

</xsl:for-each>
</xsl:template>

Postnext
(Deleted User) Subject: Sorting XSL and limiting only first n elements
Author: (Deleted User)
Date: 01 Aug 2005 03:36 PM
You can use position() which is relative to the context nodeset.

Hope this help.
Song.

Postnext
N TSubject: Sorting XSL and limiting only first n elements
Author: N T
Date: 01 Aug 2005 03:44 PM
Thanks for your reply. However, I tried that and did not work for me. The positions that are returned are 1,3,4,5 (because thats the position of original node-set). I tried:
<!-- <xsl:if test="position() &lt; 2"> -->

But, it only got me 1 element in result. because position() returned 1, 3, 4, 5.

Am I doing something wrong? Please help.

Postnext
(Deleted User) Subject: Sorting XSL and limiting only first n elements
Author: (Deleted User)
Date: 01 Aug 2005 05:02 PM
give your sorting criteria, the first item is Aerospace, the second is Mechanical, third is Aerospace again... so your xsl:if to filter out Aerospace and Electrical will have the nodes with positions as 1, 3...

please be more specific about what you mean by 'top 2 items'. do you want to show the top 2 in the entire nodeset, or top2 for both Aerospace and Electrical?

song.

Postnext
N TSubject: Sorting XSL and limiting only first n elements
Author: N T
Date: 01 Aug 2005 05:07 PM
Hello. I need to basically display top 2 items in reverse chronological order that have either Aerospace or Electrical as industry (the filter basically gives me 4 items, 3 with Aerospace and 1 with Electrical). I need the first 2 (assuming they are sorted by lastupdated).

Thanks a lot. Please feel free to send me any question/comment. I am a newbie in XSL and am not sure if I am proceeding in the right direction.

Postnext
(Deleted User) Subject: Sorting XSL and limiting only first n elements
Author: (Deleted User)
Date: 02 Aug 2005 09:32 AM
Given your description, you should remove the
<xsl:if test="industry/text() = 'Aerospace' or industry/text() 'Electrical' "> as a filter and put the filter in your xsl:for-each xpath predicate as:
<xsl:for-each select="root/news[industry = 'Aerospace' or industry = 'Electrical']">

And remember to activate your position() checking to make sure you only get the first two items.

You should be all set after this change.

Hope this helps.

Song.

Postnext
N TSubject: Sorting XSL and limiting only first n elements
Author: N T
Date: 02 Aug 2005 11:03 AM
Thanks a lot Song. That worked fine.

I just had 2 follow-up questions:

1) Is there a way I can make it faster (I read somewhere that I could use keys, just don't know how to?)
2) Also, in my sorting by lastupdated, I have an error, where 12:01 AM is being displayed ahead of 9:20 AM (in reverse chronological order), which is incorrect. I am sorting YYYY first (as number), then MM (as number), date (as number), AM/PM (as string descending), HH (as number), MI (as number). Is there a way to correct that?

Thanks.

Postnext
(Deleted User) Subject: Sorting XSL and limiting only first n elements
Author: (Deleted User)
Date: 02 Aug 2005 11:47 AM
xsl:key is an advanced feature in xslt. I encourage you to explore the topic yourself to get some good understanding.

as for your time sorting issue, because you sort the HH in number format with descending order, of course 12 will be ahead of 9 which put you 12:01am ahead 9:01am. change the descending to ascending should work as you expected.

song.

Posttop
(Deleted User) Subject: Sorting XSL and limiting only first n elements
Author: (Deleted User)
Date: 02 Aug 2005 11:43 AM
Given your description, you should remove the
<xsl:if test="industry/text() = 'Aerospace' or industry/text() 'Electrical' "> as a filter and put the filter in your xsl:for-each xpath predicate as:
<xsl:for-each select="root/news[industry = 'Aerospace' or industry = 'Electrical']">

And remember to activate your position() checking to make sure you only get the first two items.

You should be all set after this change.

Hope this helps.

Song.

   
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.