XSL 遍历项目列表
XSL Iterate through list of items
我有一个 RSS 提要,它是从一个废弃的 'Joke of the day' 博客中提取的。因为博客不再更新,所以我想遍历列表并每天显示不同的项目,最好按时间顺序排列。
How do I identify the 'first' item in the list (the oldest post) and then show the next item each day?
rss 源在这里:http://feeds.feedburner.com/DailyJokes-ACleanJokeEveryday?format=xml
完整列表在这里:http://dailyjokes.somelifeblog.com/
我的 XSL 代码在这里,当前显示位置 2 的项目,这是最近的 post:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:apply-templates select="//item[position() < 2]"/>
</xsl:template>
<xsl:template match="item">
<content-item>
<h1><xsl:value-of select="substring-before(title, ' #Joke')"/></h1>
<p><xsl:value-of select="substring-before(description, '<a href')" disable-output-escaping="yes"/></p>
</content-item>
</xsl:template>
</xsl:stylesheet>
我正在 SharePoint 2013 RSS webpart 中显示此提要
我的目标是每天展示不同的项目,但我可能会接受简单的随机化。另外,如果有人可以推荐适合我的工作内联网的免费或收费 'Joke of the day' 站点,我们将不胜感激!
My goal is to display a different item each day
为了实现您的目标,您的处理器需要知道当前日期。
以下是一个最小化示例,展示了如何使用日期来每天检索不同的项目:
XML
<rss>
<channel>
<item>
<title>Alpha</title>
</item>
<item>
<title>Bravo</title>
</item>
<item>
<title>Charlie</title>
</item>
<item>
<title>Delta</title>
</item>
<item>
<title>Echo</title>
</item>
</channel>
</rss>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="current-datetime">2017-04-27T00:00:00</xsl:param>
<xsl:template match="/rss">
<xsl:variable name="JDN">
<xsl:call-template name="JDN">
<xsl:with-param name="date" select="$current-datetime"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="n" select="count(channel/item)" />
<output>
<xsl:apply-templates select="channel/item[$JDN mod $n + 1]"/>
</output>
</xsl:template>
<xsl:template match="item">
<item>
<xsl:value-of select="title"/>
</item>
</xsl:template>
<xsl:template name="JDN">
<xsl:param name="date"/>
<xsl:param name="year" select="substring($date, 1, 4)"/>
<xsl:param name="month" select="substring($date, 6, 2)"/>
<xsl:param name="day" select="substring($date, 9, 2)"/>
<xsl:param name="a" select="floor((14 - $month) div 12)"/>
<xsl:param name="y" select="$year + 4800 - $a"/>
<xsl:param name="m" select="$month + 12*$a - 3"/>
<xsl:value-of select="$day + floor((153*$m + 2) div 5) + 365*$y + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045" />
</xsl:template>
</xsl:stylesheet>
在此示例中,结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<item>Bravo</item>
</output>
现场演示:http://xsltransform.net/pNmBxZK
如果您的处理器支持 EXSLT date:date-time()
扩展功能,您可以将样式表的 header 修改为:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="date">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="current-datetime" select="date:date-time()"/>
改为 ddwrt 命名空间中的 SharePoint, I am guessing you would need to use the TodayIso
函数。
我有一个 RSS 提要,它是从一个废弃的 'Joke of the day' 博客中提取的。因为博客不再更新,所以我想遍历列表并每天显示不同的项目,最好按时间顺序排列。
How do I identify the 'first' item in the list (the oldest post) and then show the next item each day?
rss 源在这里:http://feeds.feedburner.com/DailyJokes-ACleanJokeEveryday?format=xml 完整列表在这里:http://dailyjokes.somelifeblog.com/
我的 XSL 代码在这里,当前显示位置 2 的项目,这是最近的 post:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:apply-templates select="//item[position() < 2]"/>
</xsl:template>
<xsl:template match="item">
<content-item>
<h1><xsl:value-of select="substring-before(title, ' #Joke')"/></h1>
<p><xsl:value-of select="substring-before(description, '<a href')" disable-output-escaping="yes"/></p>
</content-item>
</xsl:template>
</xsl:stylesheet>
我正在 SharePoint 2013 RSS webpart 中显示此提要
我的目标是每天展示不同的项目,但我可能会接受简单的随机化。另外,如果有人可以推荐适合我的工作内联网的免费或收费 'Joke of the day' 站点,我们将不胜感激!
My goal is to display a different item each day
为了实现您的目标,您的处理器需要知道当前日期。
以下是一个最小化示例,展示了如何使用日期来每天检索不同的项目:
XML
<rss>
<channel>
<item>
<title>Alpha</title>
</item>
<item>
<title>Bravo</title>
</item>
<item>
<title>Charlie</title>
</item>
<item>
<title>Delta</title>
</item>
<item>
<title>Echo</title>
</item>
</channel>
</rss>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="current-datetime">2017-04-27T00:00:00</xsl:param>
<xsl:template match="/rss">
<xsl:variable name="JDN">
<xsl:call-template name="JDN">
<xsl:with-param name="date" select="$current-datetime"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="n" select="count(channel/item)" />
<output>
<xsl:apply-templates select="channel/item[$JDN mod $n + 1]"/>
</output>
</xsl:template>
<xsl:template match="item">
<item>
<xsl:value-of select="title"/>
</item>
</xsl:template>
<xsl:template name="JDN">
<xsl:param name="date"/>
<xsl:param name="year" select="substring($date, 1, 4)"/>
<xsl:param name="month" select="substring($date, 6, 2)"/>
<xsl:param name="day" select="substring($date, 9, 2)"/>
<xsl:param name="a" select="floor((14 - $month) div 12)"/>
<xsl:param name="y" select="$year + 4800 - $a"/>
<xsl:param name="m" select="$month + 12*$a - 3"/>
<xsl:value-of select="$day + floor((153*$m + 2) div 5) + 365*$y + floor($y div 4) - floor($y div 100) + floor($y div 400) - 32045" />
</xsl:template>
</xsl:stylesheet>
在此示例中,结果将是:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<item>Bravo</item>
</output>
现场演示:http://xsltransform.net/pNmBxZK
如果您的处理器支持 EXSLT date:date-time()
扩展功能,您可以将样式表的 header 修改为:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:date="http://exslt.org/dates-and-times"
extension-element-prefixes="date">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="current-datetime" select="date:date-time()"/>
改为 ddwrt 命名空间中的 SharePoint, I am guessing you would need to use the TodayIso
函数。