在XSLT中转换RSS日期

时间:2014-04-21 20:40:42

标签: xml date xslt rss

当省略工作日时,如何转换源自许多RSS-feeds(以xml为单位)的<pubDate>的值,然后对pubDate进行排序。

@Dimitre提供了一个很好的解决方案,其中包括工作日的答案: Problem sorting RSS feed by date using XSL

这里的问题是当工作日不是substring()的一部分时,如何在{答案代码}中调整pubDate pubDate {/ 1}},如下所示:

  

2009年2月17日00:05:25 +0100

此外,了解如何实现额外的RSS节点以对<link><title>进行排序会很方便。 例如,结果输出将在<pubDate><link>(或例如。<title>)上排序。 感谢您的反馈。

1 个答案:

答案 0 :(得分:0)

如果您的所有pubDate都没有工作日,则只需从sort语句中的每个子字符串起点中减去5:

<xsl:sort data-type="number" order="descending" select=
    "concat(substring(pubDate,8,4),
            $vMonths[@name 
                    = 
                     substring(current()/pubDate,4,3)]/@num,

            substring(pubDate,1,2),
            translate(substring(pubDate,13,8),
                      ':',
                      ''
                      )
            )
     "/>

但是,如果您混合使用pubDate格式,并且两者都有:

<pubDate>12 Feb 2009 01:58:03 GMT</pubDate>
<pubDate>Tue, 13 Feb 2010 02:58:03 GMT</pubDate>

子串表达式的起点需要是有条件的,具体取决于您的格式。

XSLT 2.0 中,您只需使用xpath if then else语句,如:

substring(pubDate, if (substring(pubDate,3,1)=' ') then 8 else 13 ,4)

这将检查char 3是否有空格,这是没有工作日但没有工作日格式的格式,并设置子串起始点。

XSLT 1.0 中,xpath中没有条件表达式,但是你可以通过乘以布尔表达式的结果得到相同的结果:

substring(pubDate, 
    (substring(pubDate,3,1)=' ') * 8 + (substring(pubDate,5,1)=' ') * 13 
,4)

对于没有工作日的格式,这将计算1 * 8 + 0 * 13 = 8,对于工作日的格式,这将计算0 * 8 + 1 * 13 = 13

对整个排序语句执行此操作:

    <xsl:sort data-type="number" order="descending" select=
    "concat(substring(pubDate, 
             (substring(pubDate,3,1)=' ') * 8 + (substring(pubDate,5,1)=' ') * 13 
            ,4),
            $vMonths[@name = 
              substring(current()/pubDate,
                (substring(pubDate,3,1)=' ') * 4 + (substring(pubDate,5,1)=' ') * 9
              ,3)]/@num,

            substring(pubDate,
              (substring(pubDate,3,1)=' ') * 1 + (substring(pubDate,5,1)=' ') * 6
            ,2),
            translate(
               substring(pubDate,13
                 (substring(pubDate,3,1)=' ') * 13 + (substring(pubDate,5,1)=' ') * 18
               ,8),
                      ':',
                      ''
                      )
            )
     "/>

这是一个有效的简化版本:http://xsltransform.net/jyyiVhv


关于你的第二个问题,此外,了解如何实现额外的RSS节点以便对其进行排序会很方便。例如,结果输出将按和(或例如)排序。

你通常会简单地添加<xsl:sort select="title"/>,但是考虑到之前的按日期排序,只有在完全相同的pubdate上有2个不同的标题时才会发生这种情况,这是相当不可能的,因为日期也是如此包括时间。