XSLT 1.0比较日期

4

我可以帮您把当前日期与起始日期和截止日期进行比较。

XML内容为:

<forms>
  <form id="11">
     <start>somedate</start>
     <end>someotherdate</end>
   </form>
</forms>

我目前正在尝试:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex" >

<xsl:choose>
   <xsl:when test="end != ''                
      and start != '' 
      and ex:date(start) &lt;= current-date() 
      and current-date() &lt;= ex:date(end)">
      <!-- Do Stuff -->
   </xsl:when>
</xsl:choose>

I get the following error:

xmlXPathCompOpEval: function current-date not found
XPath error : Unregistered function
XPath error : Stack usage errror
<ul class="ccb_forms_ul"></ul>

你使用的是哪个XSLT引擎?它是否支持EXSLT? - user764357
我正在使用xsltproc进行测试,但它是为在WordPress中使用而设计的,我不知道WP使用什么。我只知道上述版本的2.0在WP中不起作用。 - Simply Seth
1个回答

6
假设您的日期是以yyyy-mm-dd格式(根据您的其他问题我了解到是这样),这应该适用于大多数XSLT 1.0处理器:
<?xml version="1.0" encoding="UTF-8"?>
<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:for-each select="forms/form">

<xsl:variable name="today" select="translate(substring-before(date:date-time(), 'T'), '-', '')"/>
<xsl:variable name="start" select="translate(start, '-', '')"/>
<xsl:variable name="end" select="translate(end, '-', '')"/>

<xsl:if test="$start &lt;= $today and $today &lt;= $end">
    <!-- in progress -->
</xsl:if>

为什么这个有效?它去除日期中的 - 并按字典顺序进行比较。我可能会错过某些东西... - Mike Argyriou
@MikeArgyriou 实际上,它会从日期中删除“-”,并数值化比较结果 - 请参见:http://www.w3.org/TR/xpath/#booleans - michael.hor257k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接