如果您的所有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 或 进行排序会很方便。例如,结果输出将按和(或例如)排序。
您通常只需添加 <xsl:sort select="title"/>,但考虑到之前按日期排序,只有在完全相同的发布日期上有 2 个不同的标题时才会发生这种情况,这是相当不可能的,因为日期也包括时间。