我有一个带有这样行的 xml 文件:
<Data>
<a>something</a>
<b>20120601</b>
<c>something else</c>
</Data>
中的值是格式为 YYYYMMDD 的日期
我有一个处理每一行的小模板,并且工作正常(因为它没有太多作用)
现在我的问题是:仅当 B 中的日期大于(晚于)今天(当前日期)前 60 天时,我如何处理一行?因此,如果日期是最近的-> 处理该行,否则不要。
我有一个带有这样行的 xml 文件:
<Data>
<a>something</a>
<b>20120601</b>
<c>something else</c>
</Data>
中的值是格式为 YYYYMMDD 的日期
我有一个处理每一行的小模板,并且工作正常(因为它没有太多作用)
现在我的问题是:仅当 B 中的日期大于(晚于)今天(当前日期)前 60 天时,我如何处理一行?因此,如果日期是最近的-> 处理该行,否则不要。
这是一个完整、简短且简单的 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>
正如 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 >= $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的回答。
正如评论者所说,XSL 本身无法做到这一点。您需要首先计算出 60 天前的日期,并将其作为参数传递给您的 XSL。
在 PHP 中,您可以通过以下方式计算一天:
$date_60_days_ago = date('Y-m-d H:m:s', strtotime("-60 days"));
至于 XSL,请参阅此 XMLPlayground 会话(出于此演示的目的,我手动传递了日期)