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