我有行这样的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天更大(晚)时? 所以如果日期是最近的 - >处理行,否则不要。
正如评论者所说,XSL本身无法做到这一点。您需要先确定60天前的日期,然后将其作为参数传递给XSL。
在PHP中,你可以工作了一天以下列方式:
$date_60_days_ago = date('Y-m-d H:m:s', strtotime("-60 days"));
对于XSL,看到这个XMLPlayground会议(我通过之日起在手动此演示的目的)
由于已经的MiMo表示没有内置函数来得到当前日期在XSLT 1.0。您可以将params传递到您的xslt样式表中,但这取决于您使用的xslt处理器。
如果你通过了回复日期(curret日期减去60天)作为PARAM,您的测试可以如此简单:
<?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的回答采用。
这是一个完整的,短期和简单的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>
无法在标准XSLT/XPath中访问当前日期,您需要某种扩展功能。你在使用哪种XSLT处理器? – MiMo