XML Feed构建后如何实现内外部新闻按pubDate全局排序?
实现内外部新闻全局按pubDate降序排序的XSLT方案
核心思路很简单:不要先分别排序内外部新闻再拼接,而是先把所有内外部新闻节点合并成一个集合,再对整个集合统一按pubDate降序排序后输出。以下是针对不同XSLT版本的具体实现:
假设你的XML数据源结构类似这样
<newsFeed> <internalNews> <item> <title>内部新闻1</title> <pubDate>2024-05-20T10:00:00</pubDate> <!-- 其他字段:link、description等 --> </item> <item> <title>内部新闻2</title> <pubDate>2024-05-22T14:30:00</pubDate> </item> </internalNews> <externalNews> <item> <title>外部新闻1</title> <pubDate>2024-05-25T09:15:00</pubDate> </item> <item> <title>外部新闻2</title> <pubDate>2024-05-18T16:45:00</pubDate> </item> </externalNews> </newsFeed>
XSLT 2.0+ 实现(简洁高效)
如果你的Modern Campus CMS支持XSLT 2.0或更高版本,直接用节点合并语法即可:
<xsl:template match="/newsFeed"> <rss version="2.0"> <channel> <!-- 保留原有Feed头部配置 --> <title>全局排序的新闻Feed</title> <link>https://your-domain.com/news</link> <description>整合内外部新闻并按发布时间排序</description> <!-- 合并所有内外部新闻节点,统一排序 --> <xsl:for-each select="internalNews/item | externalNews/item"> <!-- 按pubDate降序排序,指定datetime类型确保排序准确 --> <xsl:sort select="pubDate" order="descending" data-type="datetime"/> <item> <!-- 复制需要的新闻字段 --> <xsl:copy-of select="title"/> <xsl:copy-of select="pubDate"/> <xsl:copy-of select="link|description"/> </item> </xsl:for-each> </channel> </rss> </xsl:template>
这里用|运算符直接选取所有内部和外部的item节点,然后通过<xsl:sort>实现全局降序排序。
XSLT 1.0 实现(兼容旧版引擎)
如果CMS仅支持XSLT 1.0,需要借助扩展函数将临时节点集转换为可遍历的集合:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common" exclude-result-prefixes="exsl"> <xsl:template match="/newsFeed"> <rss version="2.0"> <channel> <!-- 保留Feed头部 --> <title>全局排序的新闻Feed</title> <link>https://your-domain.com/news</link> <description>整合内外部新闻并按发布时间排序</description> <!-- 第一步:合并内外部新闻到临时变量 --> <xsl:variable name="allNewsItems"> <xsl:copy-of select="internalNews/item"/> <xsl:copy-of select="externalNews/item"/> </xsl:variable> <!-- 第二步:转换为节点集并排序输出 --> <xsl:for-each select="exsl:node-set($allNewsItems)/item"> <!-- 如果pubDate是ISO 8601或RFC 822格式,text类型排序即可生效 --> <xsl:sort select="pubDate" order="descending" data-type="text"/> <item> <xsl:copy-of select="title"/> <xsl:copy-of select="pubDate"/> <xsl:copy-of select="link|description"/> </item> </xsl:for-each> </channel> </rss> </xsl:template> </xsl:stylesheet>
注意:如果你的CMS使用MSXML处理器,需要把exsl命名空间替换为msxsl,即xmlns:msxsl="urn:schemas-microsoft-com:xslt",并将exsl:node-set()改为msxsl:node-set()。
关键注意事项
- 确保
pubDate字段是标准可排序格式:比如ISO 8601(YYYY-MM-DDTHH:MM:SS)或RSS标准的RFC 822格式(Wed, 25 May 2024 09:15:00 GMT),否则排序结果会出错。 - 如果原XSLT中有针对内外部新闻的特殊处理(比如添加来源标识),把这些逻辑移到排序后的
<item>生成步骤中即可。
内容的提问来源于stack exchange,提问作者JesseEarley
相关产品推荐
相关产品推荐

