Sorting XSLT output items

J

Jure Sah

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello,

I have an XSLT that checks several XML files (using document() ) and
outputs their combined contents. The items inside it have a date
argument according to which I would like to sort the result. How can
this be done?

That is... the usual sort will allow you to sort values from the input
file, but since my XSLT uses several other files in succession and
processes each of their items in a nested loop, I do not see where I
should put the sort tag to achieve the desired effect.

The only solution I see is to use an XSLT sort on the XSLT file output,
but that seems silly.

Thanks for any help in advance.

LP,
Jure
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFJqK5pB6mNZXe93qgRArpKAJ95RHmaUjJ2xoBDW2+fAyl22y5urgCeJZPC
20XWXIcqPfzV0Ft0ynWW8Q8=
=dTj9
-----END PGP SIGNATURE-----
 
M

Martin Honnen

Jure said:
I have an XSLT that checks several XML files (using document() ) and
outputs their combined contents. The items inside it have a date
argument according to which I would like to sort the result. How can
this be done?

<xsl:apply-templates select="document('file1.xml')/foo/bar |
document('file2.xml')/foo/bar">
<xsl:sort select="dateElement"/>
</xsl:apply-templates/>

Note that only XSLT 2.0 has support for sorting dates in the W3C XML
schema date format. With XSLT 1.0 you will need to make sure you have
the date in a format like '2009-02-28' that allows string sorting.
 
J

Jure Sah

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Martin Honnen pravi:
<xsl:apply-templates select="document('file1.xml')/foo/bar |
document('file2.xml')/foo/bar">
<xsl:sort select="dateElement"/>
</xsl:apply-templates/>

I can't use that, my files are defined in the XML file I am processing.

Any additional ideas?

LP,
Jure
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFJqga1B6mNZXe93qgRAkB4AJ94ab4yjywTrzrMDvqagLpn+Kc3YwCgwJO0
oPruOVHNsVhJUlmGhkULDXw=
=5mF/
-----END PGP SIGNATURE-----
 
M

Martin Honnen

Jure said:
Martin Honnen pravi:

I can't use that, my files are defined in the XML file I am processing.

Any additional ideas?

Nevertheless you should be able to process the union of nodes in those
documents and sort them. But you keep us guessing, show us your XML
input(s) and the result you want to produce, then we can suggest a way
how to solve that.
 
J

Jure Sah

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Martin Honnen pravi:
Nevertheless you should be able to process the union of nodes in those
documents and sort them. But you keep us guessing, show us your XML
input(s) and the result you want to produce, then we can suggest a way
how to solve that.

My code is available here:
http://dustwolf.ctrl-alt-del.si/downloads/XSLTaggregator_src.zip

As the name says, the code is a RSS Aggregator. Picks the URLs of the
RSS feeds to combine from an XML file and outputs the resulting feed.
Everything works fine, except the results are not sorted by date.

The code goes a little like this:
<xsl:for-each select="feed:rss2">
<xsl:variable name="myURL" select="." />
<xsl:for-each select="document($myURL)/rss/channel/item">

...that is the two nested "for-each"es.

Any ideas?

Thanks.. really. :)

LP,
Jure
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFJqt9jB6mNZXe93qgRApx7AJ9ZV5a82giJvMzw/857+KlOaFjO6QCgomZ7
4yAoOfSa7GSdnfIQH2YbtT8=
=HeXO
-----END PGP SIGNATURE-----
 
D

David Carlisle

Jure said:
The code goes a little like this:
<xsl:for-each select="feed:rss2">
<xsl:variable name="myURL" select="." />
<xsl:for-each select="document($myURL)/rss/channel/item">

..that is the two nested "for-each"es.

Any ideas?

just use one for-each then it's easier to sort over the whole collection.

<xsl:for-each select="document(feed:rss2)/rss/channel/item">
<xsl:sort select= something ...
 
J

Jure Sah

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

David Carlisle pravi:
just use one for-each then it's easier to sort over the whole collection.

<xsl:for-each select="document(feed:rss2)/rss/channel/item">
<xsl:sort select= something ...

That worked great! Thanks a bunch!

LP,
Jure
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFJrCKyB6mNZXe93qgRAm7NAJ44ULtgBzuybjIZLWlw5s280T3y7gCaAsPz
SSxm9T0MZS6GTz8cAAoGnjg=
=MWke
-----END PGP SIGNATURE-----
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,186
Members
46,740
Latest member
JudsonFrie

Latest Threads

Top