Xslt 与当前日期比较

Xslt 与当前日期比较,xslt,Xslt,我有一个xml文件,其中的行如下: <Data> <a>something</a> <b>20120601</b> <c>something else</c> </Data> 某物 20120601 别的 中的值是格式为YYYYMMDD的日期 我有一个处理每一行的小模板,它工作得很好(因为它做的不多) 现在我的问题是: 仅当B中的日期大于(晚于)今天(当前日期)前60天时

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

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

某物
20120601
别的
中的值是格式为YYYYMMDD的日期

我有一个处理每一行的小模板,它工作得很好(因为它做的不多)

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

正如评论员所说,XSL不能自己完成这项工作。您需要首先计算出60天前的日期,并将其作为参数传递给XSL

在PHP中,您可以按以下方式计算一天:

$date_60_days_ago = date('Y-m-d H:m:s', strtotime("-60 days"));
至于XSL,请参阅本次XMLPlayerd会话(为了演示的目的,我手动输入日期)


正如MiMo已经指出的那样,XSLT1.0中没有内置函数来获取当前日期。您可以将参数传递到xslt样式表中,但这取决于您使用的xslt处理器

如果您将回溯日期(curret date减去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>
。。。但是您需要将
日期值转换为相应的值,或者格式化
回溯日期
变量以适合您的日期值


摘自Dimitre在上的回答。

这里是一个完整、简短且简单的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>

在标准XSLT/XPath中无法访问当前日期,您需要某种扩展函数。您使用的是哪个XSLT处理器?
<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>
<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>
<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>