2009-02-16 7 views
4

Je crée un site Web dans lequel je dois afficher les cinq premiers enregistrements d'un flux RSS, et ceux-ci doivent être triés par date et heure.Problème de tri du flux RSS par date à l'aide de XSL

Les champs de date dans le flux RSS sont dans le format suivant: « Lun 16 février 2009 16:02:44 GMT »

Je vais avoir de gros problèmes pour obtenir les dossiers pour trier correctement - je J'ai essayé beaucoup d'exemples de code différents, mais aucun ne semble trier les enregistrements correctement. Le code de ma feuille XSL est indiqué ci-dessous, et le flux en question est here.

Très reconnaissant pour toute aide!

Merci,

Chris.


CODE XSL:

<xsl:stylesheet version="1.1" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:digg="http://digg.com//docs/diggrss/" 
xmlns:dc="http://purl.org/dc/elements/1.1/"> 
<xsl:template match="/">  
<xsl:for-each select="//*[local-name()='item'][position() < 6]">  
    <p> 
     <a> 
     <xsl:attribute name="href"> 
     <xsl:value-of select="*[local-name()='link']"/></xsl:attribute> 
     <xsl:attribute name="target"> 
     <xsl:text>top</xsl:text> 
     </xsl:attribute> 
     <xsl:value-of select="*[local-name()='title']"/> 
     </a> 
     <br/> 
    <span class="smaller"><xsl:value-of select="*[local-name()='pubDate']" disable-output-escaping="yes"/></span> 
    </p> 
</xsl:for-each> 

+0

Vous n'avez pas fourni d'exemple de fichier XML (RSS) pour lequel vous voulez que le tri soit effectué, et vous n'avez pas fourni la sortie exacte que vous avez vouloir être produit. S'il vous plaît, éditez votre question et fournissez ces deux choses importantes. Alors beaucoup de gens pourront aider. Ce n'est pas si difficile. –

Répondre

8

La transformation suivante:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:variable name="vrtfMonths"> 
    <m name="Jan" num="01"/> 
    <m name="Feb" num="02"/> 
    <m name="Mar" num="03"/> 
    <m name="Apr" num="04"/> 
    <m name="May" num="05"/> 
    <m name="Jun" num="06"/> 
    <m name="Jul" num="07"/> 
    <m name="Aug" num="08"/> 
    <m name="Sep" num="09"/> 
    <m name="Oct" num="10"/> 
    <m name="Nov" num="11"/> 
    <m name="Dec" num="12"/> 
    </xsl:variable> 

    <xsl:variable name="vMonths" select= 
    "document('')/*/xsl:variable 
        [@name='vrtfMonths']/*" 
    /> 

    <xsl:template match="channel"> 
     <xsl:for-each select="item"> 
     <xsl:sort data-type="number" order="descending" select= 
     "concat(substring(pubDate,13,4), 
       $vMonths[@name 
         = 
         substring(current()/pubDate,9,3)]/@num, 

       substring(pubDate,6,2), 
       translate(substring(pubDate,18,8), 
          ':', 
          '' 
         ) 
       ) 
     "/> 

     <xsl:if test="not(position() > 5)"> 
      <xsl:copy-of select="."/> 

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

lorsqu'il est appliqué sur le document XML source fourni (trop long à la liste il re, voir le link),

produit le résultat recherché:

<item xmlns:media="http://search.yahoo.com/mrss"> 
     <title>Inflation rate expected to fall</title> 
     <description>The latest figures for the rate of inflation, for the 12 months to January, are expected to show that it has fallen again.</description> 
     <link>http://news.bbc.co.uk/go/rss/-/1/hi/business/7893873.stm</link> 
     <guid isPermaLink="false">http://news.bbc.co.uk/1/hi/business/7893873.stm</guid> 
     <pubDate>Tue, 17 Feb 2009 02:58:03 GMT</pubDate> 
     <category>Business</category> 
     <media:thumbnail width="66" height="49" url="http://newsimg.bbc.co.uk/media/images/45483000/jpg/_45483998_cash226.jpg" /> 
    </item><item xmlns:media="http://search.yahoo.com/mrss"> 
     <title>Farming pressures</title> 
     <description>Are farmers being forced to use GM seeds?</description> 
     <link>http://news.bbc.co.uk/go/rss/-/1/hi/business/7892328.stm</link> 
     <guid isPermaLink="false">http://news.bbc.co.uk/1/hi/business/7892328.stm</guid> 
     <pubDate>Tue, 17 Feb 2009 00:06:31 GMT</pubDate> 
     <category>Business</category> 
     <media:thumbnail width="66" height="49" url="http://newsimg.bbc.co.uk/media/images/45481000/jpg/_45481936_005666785-1.jpg" /> 
    </item><item xmlns:media="http://search.yahoo.com/mrss"> 
     <title>Engine room?</title> 
     <description>Western Australia's economy may be hitting reverse. </description> 
     <link>http://news.bbc.co.uk/go/rss/-/1/hi/business/7840370.stm</link> 
     <guid isPermaLink="false">http://news.bbc.co.uk/1/hi/business/7840370.stm</guid> 
     <pubDate>Tue, 17 Feb 2009 00:05:25 GMT</pubDate> 
     <category>Business</category> 
    </item><item xmlns:media="http://search.yahoo.com/mrss"> 
     <title>Coining it in? </title> 
     <description>Investors turning to old and rare coins in the downturn </description> 
     <link>http://news.bbc.co.uk/go/rss/-/1/hi/business/7878606.stm</link> 
     <guid isPermaLink="false">http://news.bbc.co.uk/1/hi/business/7878606.stm</guid> 
     <pubDate>Tue, 17 Feb 2009 00:04:29 GMT</pubDate> 
     <category>Business</category> 
     <media:thumbnail width="66" height="49" url="http://newsimg.bbc.co.uk/media/images/45459000/jpg/_45459789_dsc_4982.jpg" /> 
    </item><item xmlns:media="http://search.yahoo.com/mrss"> 
     <title>Home sales may rise say surveyors</title> 
     <description>Property sales may pick in the next few months, according to the Royal Institution of Chartered Surveyors (Rics).</description> 
     <link>http://news.bbc.co.uk/go/rss/-/1/hi/business/7893193.stm</link> 
     <guid isPermaLink="false">http://news.bbc.co.uk/1/hi/business/7893193.stm</guid> 
     <pubDate>Tue, 17 Feb 2009 00:02:19 GMT</pubDate> 
     <category>Business</category> 
     <media:thumbnail width="66" height="49" url="http://newsimg.bbc.co.uk/media/images/45483000/jpg/_45483075_006771638-1.jpg" /> 
    </item> 
+0

Dimitre brillant! C'est juste ce que je cherchais! Merci beaucoup. – pixelkicks

+0

Peut-on faire la même chose, sans utiliser de document ('')? Ou est ce qui permet l'accès xpath aux éléments dans le fichier .xsl? Je demande parce que DotNetNuke n'analyse pas le document ('') dans un fichier XSL par défaut. –

+0

@ steve-t On pourrait utiliser la fonction d'extension xxx: node-set(), ou bien mettre le contenu de la variable $ vrtfMonths dans un fichier xml séparé, puis le référencer via document (thatFilesURL) –

0

Une autre façon de contourner la restriction du document est d'utiliser les éléments suivants:

<xsl:template name="getMonth"> 
    <xsl:param name="name" /> 
    <xsl:choose> 
     <xsl:when test="$name = 'Jan'">01</xsl:when> 
     <xsl:when test="$name = 'Feb'">02</xsl:when> 
     <xsl:when test="$name = 'Mar'">03</xsl:when> 
     <xsl:when test="$name = 'Apr'">04</xsl:when> 
     <xsl:when test="$name = 'May'">05</xsl:when> 
     <xsl:when test="$name = 'Jun'">06</xsl:when> 
     <xsl:when test="$name = 'Jul'">07</xsl:when> 
     <xsl:when test="$name = 'Aug'">08</xsl:when> 
     <xsl:when test="$name = 'Sep'">09</xsl:when> 
     <xsl:when test="$name = 'Oct'">10</xsl:when> 
     <xsl:when test="$name = 'Nov'">11</xsl:when> 
     <xsl:when test="$name = 'Dec'">12</xsl:when> 
     <xsl:otherwise>99</xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

appelé à l'aide

<xsl:call-template name="getMonth"> 
     <xsl:with-param name="name" select="substring(./pubDate,9,3)" /> 
    </xsl:call-template> 

Ce n'est pas joli, mais au moins vous n'avez pas à vous soucier de la sécurité