2012-06-08 49 views
1

我有行这样的xml文件:比较当前日期

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

的值是一个日期格式YYYYMMDD

我有处理每行一个小模板,这是工作罚款(因为它没有太多)

现在我的问题: 如何处理一个行,只有当B中的日期比今天(当前日期)之前的60天更大(晚)时? 所以如果日期是最近的 - >处理行,否则不要。

+0

无法在标准XSLT/XPath中访问当前日期,您需要某种扩展功能。你在使用哪种XSLT处理器? – MiMo

回答

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

0

由于已经的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 &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对subtracting days的回答采用。

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> 
相关问题