2013-02-21 56 views
3

有人知道在XSL中做這種排序的方法嗎?使用XSL按照RFC-822日期格式對XML進行排序

這是我到目前爲止,但它只是按日排序,忽略了日期的其餘部分。

 <xsl:apply-templates select="item"> 
      <xsl:sort select="pubDate" data-type="text" order="descending"/> 
     </xsl:apply-templates> 
+2

的日期只是日期或日期時間?你在使用XSLT 1.0還是XSLT 2.0?你也可以編輯你的答案張貼你的XML? – 2013-02-21 22:08:17

+1

這當然是可能的,但不是微不足道的。您必須在XSLT中編寫一個解析器,將RFC-822日期轉換爲可排序的日期。我會使用EXSLT函數和XPath字符串函數。 – nwellnhof 2013-02-21 23:33:06

+1

這可能會有所幫助http://www.codeproject.com/Articles/4261/Sorting-dates-in-XSL – Vinit 2013-02-22 02:04:30

回答

2

感謝您的快速回復傢伙。讓我朝着正確的方向前進。管理解決它!找到一個有用的鏈接http://blog.mastykarz.nl/how-to-do-it-rss-aggregation-merging-multiple-xml-files-using-xslt/

我使用的是XSLT 2.0版。只是一個使用變量替代MMM月份並將日期細分的日子。

SOLUTION

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:variable name="Months" select="'Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec'"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="channel"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()[not(preceding-sibling::item) and not(self::item)]"/> 
     <xsl:apply-templates select="item"> 
      <!-- year --> 
     <xsl:sort select="substring(pubDate, 13, 4)" order="descending" data-type="number"/> 
     <!-- month --> 
     <xsl:sort select="string-length(substring-before($Months, substring(pubDate, 9, 3)))" order="descending" data-type="number"/> 
     <!-- day --> 
     <xsl:sort select="substring(pubDate, 6, 2)" order="descending" data-type="number"/> 
     <!-- hour --> 
     <xsl:sort select="substring(pubDate, 18, 2)" order="descending" data-type="number"/> 

     </xsl:apply-templates> 
     <xsl:apply-templates select="@*|node()[not(following-sibling::item) and not(self::item)]"/> 
</xsl:copy> 
</xsl:template> 

+1

該解決方案看起來非常脆弱,因爲它假定日期時間元素始終位於字符串中的相同位置。這不一定是真的。例如,日期時間開始的星期幾是可選的。此外,可能會使用一位或兩位數字指定月份中的某一天。 – nwellnhof 2013-02-23 11:23:56

+1

@nwellnhof如果他們使用RFC-822日期,那不應該是這樣。我假設OP正在使用RSS提要並且爲了驗證,pubDate有非常嚴格的要求。現在,pubDate並不一定是格式,但它確實是有效的。 – doubleJ 2013-11-07 19:58:01

相關問題