1

我有一个带有这样行的 xml 文件:

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

中的值是格式为 YYYYMMDD 的日期

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

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

4

3 回答 3

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>
于 2012-06-09T02:06:02.923 回答
0

正如 MiMo 已经说过的那样,没有内置函数可以在 xslt 1.0中获取当前日期。您可以将参数传递到您的 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 关于减去 days的回答。

于 2012-06-08T14:46:45.970 回答
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

于 2012-06-08T14:35:13.807 回答