大家好日子,
我有以下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
中当前日期匹配的日期值startDate
和endDate
显示有效的XSLT 1.0
。
Fyi,此XML位于静态文件中,并通过document()
函数包含在内。整个网站使用PHP的xsltProcessor()
函数在服务器端进行。
我希望很快就能看到PHP本地运行XSLT 2.0处理器。
任何提示都将不胜感激。
谢谢。
答案 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不提供任何日期功能。