当省略工作日时,如何转换源自许多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>
)上排序。
感谢您的反馈。
答案 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个不同的标题时才会发生这种情况,这是相当不可能的,因为日期也是如此包括时间。