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根据日期值有效startDateendDateXSLT 1.0.

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

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

任何提示将不胜感激。

谢谢你。

4

2 回答 2

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 实现的……他们在这种情况下就是这样做的。

date:difference 函数返回第一个日期和第二个日期之间的持续时间。如果第一个日期出现在第二个日期之前,则结果为正持续时间;如果它发生在第二个日期之后,则结果为负持续时间。

因此你可以使用:

<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 文档。但请注意,并非所有 XSLT 处理器都支持 EXSLT 函数,因此您将牺牲一些可移植性。

于 2010-11-09T02:35:49.203 回答
1

您最好的选择可能是将当前日期作为参数传递。不幸的是,XSLT 1.0 不提供任何日期函数。

于 2010-11-09T00:35:01.323 回答