XSL,比较日期以排除任何过去的事件

时间:2009-08-31 18:54:00

标签: datetime rss xslt

我有一个事件订阅源的RSS。我想隐藏以前的事件。

假设

的XML数据子集
<Navigation Name="ItemList" Type="Children">
<Page ID="x32444" URL="..." Title="Class..."
EventStartDate="20090831T23:00:00" EventEndDate="20090904T23:00:00"
  EventStartTime="20090830T15:30:00" EventEndTime="20090830T18:30:00" Changed="20090830T20:28:31" CategoryIds="" Schema="Event"
  Name="Class of 2010 BAKE SALE"/>
 <Page ID="x32443" URL="x32443.xml?Preview=true&Site=&UserAgent=&IncludeAllPages=true&tfrm=4" Title="Class of 2010 BAKE SALE"
  Abstract="Treat yourself with our famous 10-star FRIED ICE CREAM!" EventStartDate="20090831T23:00:00" EventEndDate="20090904T23:00:00"
  EventStartTime="20090830T15:30:00" EventEndTime="20090830T18:30:00" Changed="20090830T20:25:35" CategoryIds="" Schema="Event"
  Name="Class of 2010 BAKE SALE"/>
 <Page ID="x32426" URL="x32426.xml?Preview=true&Site=&UserAgent=&IncludeAllPages=true&tfrm=4" Title="Tribute to ..."
  Abstract="Event to recognize and celebrate the lifetime of leadership and service ..."
  EventStartDate="20091206T00:00:00" EventEndDate="20091206T00:00:00" EventStartTime="20090828T23:00:00" EventEndTime="20090828T04:00:00"
  Changed="20090828T22:09:54" CategoryIds="" Schema="Event" Name="Tribute to ...."/>


</Navigation>

如何在今天的日期之前不包含任何内容

<xsl:apply-template select="Page[@EventStartDate=notBeforeToday()]"/>

2 个答案:

答案 0 :(得分:0)

使用从外部设置的XSL参数最简单。

<xsl:param name="today" select="'undefined'" />

<!-- time passes... -->

<xsl:apply-templates select="Page[@EventStartDate &lt; $today]"/>

您的日期格式是可以使用字符串比较进行比较,除非涉及不同的时区。你只需设置

20091001T00:00:00

作为$today的参数值。查看您的XSLT处理器文档以了解具体方法。

另一种方法是使用扩展功能。这取决于您的XSLT处理器支持哪些扩展功能,因此这种方法不可移植。

答案 1 :(得分:0)

为此,我通常在XML中添加一个额外的日期属性,其中包含自1900年以来的日期编号。

例如@ dateid ='9876543'或@ seconds =“9876675446545”

然后我可以轻松地与今天或XSL中的另一个变量进行比较。

您也可以使用此技术比较使用“Unix时间”的时间,例如