【问题标题】:transformation of RSS date in XSLTXSLT 中 RSS 日期的转换
【发布时间】:2014-04-21 20:40:41
【问题描述】:

如果省略工作日,然后对 pubDate 进行排序,如何转换源自许多 RSS 提要(以 xml 格式)的 <pubDate> 的值。

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

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

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

此外,知道如何实现一个附加的 RSS 节点来进行排序会很方便,例如 <link><title>。 例如,结果输出将按<pubDate><link>(或例如<title>)排序。 感谢您的反馈。

【问题讨论】:

  • 是什么阻止您使用substring($string_with_weekday, 6)substring-after($string_with_weekday, ', ') 作为@Dimitre 建议的输入?至于你的其他问题,我认为最好在这里删除它们并将它们变成单独的 SO 问题(当然,在完成适当的研究之后)。

标签: xml date xslt rss


【解决方案1】:

如果您的所有pubDate 都没有工作日,您只需从排序语句中的每个子字符串起点减去 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 节点来对 like 或 进行排序会很方便。例如,结果输出将按和(或例如)排序。

您通常只需添加 &lt;xsl:sort select="title"/&gt;,但考虑到之前按日期排序,只有在完全相同的发布日期上有 2 个不同的标题时才会发生这种情况,这是相当不可能的,因为日期也包括时间。

【讨论】:

  • 感谢您提供混合 pubDate 格式和工作简化版本的解决方案。太好了。
猜你喜欢
  • 2022-01-11
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多