I have to take first 4 comments ordered descending from all comments in this xml, (ordered by date_added):
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="get7Comments.xsl"?>
<products>
<product id="1">
<comment id="1">
<username>admin1</username>
<text>nice</text>
<date_added>20.06.2005</date_added>
</comment>
<comment id="2">
<username>admin2</username>
<text>too nice</text>
<date_added>11.05.2005</date_added>
</comment>
</product>
<product id="2">
<comment id="1">
<username>admin1</username>
<text>comment1</text>
<date_added>19.05.2005</date_added>
</comment>
<comment id="2">
<username>daniel</username>
<text>comment2</text>
<date_added>06.05.2005</date_added>
</comment>
<comment id="3">
<username>another</username>
<text>comment3</text>
<date_added>15.05.2005</date_added>
</comment>
</product>
</products>
Example of output for the last 4 comments that I want:
admin1 : nice : 20.06.2005
admin1 : comment1 : 19.05.2005
another : comment3 : 15.05.2005
admin2 : too nice : 11.05.2005
Works perfectly if I let them as a list of items -comments-, but not after I separate them under a new tag
<product id=""> comments </product>
I can’t sort them all and take first 4. How it works if I dont’t have the ‘product’ tag, I mean all coments have as the parent ‘products’ tag :
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8"/>
<xsl:template match ="products">
<xsl:for-each select="product[position() < 8]">
<xsl:sort select="normalize-space(substring(date_added,7,4))" order="descending" />
<xsl:sort select="normalize-space(substring(date_added,4,2))" order="descending" />
<xsl:sort select="normalize-space(substring(date_added,0,2))" order="descending" />
<xsl:variable name="commID" select="@id" />
<a href="index.php?p=comment&id={$commID}">
<xsl:value-of select="substring(text,0,60)" />
</a><br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Not sure what you’re trying to do exactly, but try using an
xsl:apply-templatesinstead of anxsl:for-each.Example:
XSLT 1.0
using your XML input produces:
Your href’s will need modifying if you have duplicate comment id’s across products (like you have in your example XML).
(Edit: Missed that you’re trying to return the top 4 comments. Fixed. Also fixed typo in 3rd
substring().)