XSLT使用字符串日期显示数据

时间:2010-11-09 00:30:06

标签: date xslt xslt-1.0

大家好日子,

我有以下XML数据:

<?xml version="1.0" encoding="utf-8" ?>
<Publicity>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
    <pub display="left" type="image" url="http://www.link.to.website" alt="Lorem ipsum" startDate="2010-09-01" endDate="2011-09-01">http://link.to.image/banner.gif</pub>
</Publicity>

我希望仅根据与pub中当前日期匹配的日期值startDateendDate显示有效的XSLT 1.0

Fyi,此XML位于静态文件中,并通过document()函数包含在内。整个网站使用PHP的xsltProcessor()函数在服务器端进行。

我希望很快就能看到PHP本地运行XSLT 2.0处理器。

任何提示都将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:2)

鉴于您的startDate和endDate采用“YYYY-mm-dd”格式,您可以删除连字符并进行数字比较:

<xsl:variable name="numericCurrentDate"
              select="number(translate($currentDate, '-', ''))"/>
<xsl:if test="$numericCurrentDate >= number(translate(startDate, '-', '')) and
              number(translate(endDate, '-', '')) >= $numericCurrentDate">...

(感谢http://www.dpawson.co.uk/xsl/sect2/N7218.html

注意,translate(string, 'abcde...', '')返回参数字符串的副本,其中删除了任何出现的字符'abcde ...'。

或者,您可以使用扩展功能。 PHP的XSLT(使用libxslt)应该支持EXSLT date:difference之类的扩展,只要文档说它们是由libxslt实现的......在这种情况下它们就是这样做的。

  

日期:差异功能返回   第一次约会之间的持续时间   和第二个约会。如果是第一次约会   然后发生在第二个日期之前   结果是持续时间很长;如果   它出现在第二个日期之后,   结果是负时间。

因此你可以使用:

<xsl:variable name="currentDate" select="date:date()" />
<xsl:for-each select="...">
    <xsl:if test="starts-with(date:difference($currentDate, startDate), '-') and
                  starts-with(date:difference(endDate, $currentDate), '-')">
       Do something with publication...

请注意,EXSLT为我们提供了获取当前日期的功能,因此我们不必将其作为参数传递,并且可以比较两个日期。

有关如何使用EXSLT的日期模块的信息,包括如何声明命名空间,请参阅EXSLT docs。但请注意,所有XSLT处理器都不支持EXSLT功能,因此您将牺牲一些可移植性。

答案 1 :(得分:1)

您最好的选择可能是通过as a parameter中的当前日期。不幸的是,XSLT 1.0不提供任何日期功能。