我有一个xml文件,其行如下:
<Data>
<a>something</a>
<b>20120601</b>
<c>something else</c>
</Data>
值in是格式为YYYYMMDD
的日期我有一个处理每一行的小模板,哪个工作正常(因为它没有做太多)
现在我的问题: 如果B中的日期大于(晚于)今天(当前日期)之前的60天,我该如何处理行? 因此,如果日期是最近的 - &gt;处理行,否则不处理。
答案 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会话(我为了演示而手动传递日期)
答案 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 >= $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的回答。