与当前日期比较

时间:2012-06-08 14:10:42

标签: xslt

我有一个xml文件,其行如下:

<Data>
    <a>something</a>
    <b>20120601</b>
    <c>something else</c>
</Data>

值in是格式为YYYYMMDD

的日期

我有一个处理每一行的小模板,哪个工作正常(因为它没有做太多)

现在我的问题: 如果B中的日期大于(晚于)今天(当前日期)之前的60天,我该如何处理行? 因此,如果日期是最近的 - &gt;处理行,否则不处理。

3 个答案:

答案 0 :(得分:2)

这是一个完整,简短的XSLT 2.0解决方案

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:param name="pPeriod" select="'P60D'"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match=
 "Data
   [current-date()
   -
    xs:date(concat(substring(b,1,4),
                   '-',
                   substring(b,5,2),
                   '-',
                   substring(b,7)
                   )
            )
    gt xs:dayTimeDuration($pPeriod)
   ]"/>
</xsl:stylesheet>

应用于此XML文档时:

<t>
    <Data>
        <a>something</a>
        <b>20120601</b>
        <c>something else</c>
    </Data>
    <Data>
        <a>something</a>
        <b>20120420</b>
        <c>something else</c>
    </Data>
    <Data>
        <a>something</a>
        <b>20120301</b>
        <c>something else</c>
    </Data>
</t>

生成了所需的正确结果(最后Data元素“已删除”):

<t>
      <Data>
            <a>something</a>
            <b>20120601</b>
            <c>something else</c>
      </Data>
      <Data>
            <a>something</a>
            <b>20120420</b>
            <c>something else</c>
      </Data>
</t>

答案 1 :(得分:0)

正如评论者所说,XSL本身无法做到这一点。您需要先弄清楚60天前的日期,然后将其作为参数传递给您的XSL。

在PHP中,您可以通过以下方式解决这一天:

$date_60_days_ago = date('Y-m-d H:m:s', strtotime("-60 days"));

对于XSL,请参阅此XMLPlayground会话(我为了演示而手动传递日期)

http://www.xmlplayground.com/sK82Q4

答案 2 :(得分:0)

正如MiMo已经声明的那样,没有内置函数可以在xslt 1.0 中获取当前日期。您可以将params传递到xslt样式表中,但这取决于您使用的xslt处理器。

如果您将返回日期(当前日期减去60天)作为参数传递,您的测试可以简单:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:param name="backdate" />

    <xsl:template match="Data">
        <xsl:if test="(./b &gt;= $backdate)">
            <xsl:apply-templates />
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

xslt 2.0 中,您可以使用内置的current-date()函数

<xsl:variable name="backdate" select="current-date() -60*xs:dayTimeDuration('P1D')" />

...但您需要相应地投射<b>日期值,或格式化backdate变量以适合您的日期值。

采用Dimitre对subtracting days的回答。