2011-01-06 23 views
5

可以說我有一個包含屬性datetime的節點列表,我只想選擇$ compare-datetime之後發生的記錄。XSLT1.0/XPath 1.0按日期範圍選擇節點。這甚至有可能嗎?

<records> 
    <record @datetime="2010-01-04T16:48:15.501-05:00"/> 
    <record @datetime="2010-01-03T16:48:15.501-05:00"/> 
    ...etc... 
</records> 

XQuery中選擇日期範圍內的項目,我會做

/records/record[xs:dateTime(@datetime) > xs:dateTime($compare-datetime)] 

但是在XSLT 1.0我已經嘗試了不同的方法和尋找答案的很多很多,沒有任何運氣得到這個上班。

我開始認爲將實際的dateTime解析爲一個整數值,這在xslt中不是一個簡單的任務。

我希望有人可以給我一個明確的答案,所以我至少可以知道我對不起。

乾杯,

凱西

回答

6

如果日期始終處於同一時區,並有固定寬度字段(在各個領域不斷位數),我相信你可以採取this approach:刪除標點符號,留下的號碼,並比較數字。

<xsl:variable name="datetime-punctuation" select="'-.:T'" /> 
<xsl:variable name="stripped-compare-datetime" 
    select="number(translate($compare-datetime, $datetime-punctuation, ''))" /> 

然後使用

/records/record[number(translate(@datetime, $datetime-punctuation, '')) 
       > $stripped-compare-datetime)] 
5

也許它不是最好的解決辦法,但我有這樣的:

XML輸入:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="dates.xsl"?> 
<records> 
    <record datetime="2010-01-04T16:48:15.501-05:00"/> 
    <record datetime="2011-01-04T16:48:15.501-05:00"/> 
</records> 

XSLT:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:date="http://exslt.org/dates-and-times" 
    extension-element-prefixes="date"> 
    <xsl:import href="date.difference.template.xsl"/> 
    <!-- http://exslt.org/date/functions/difference/date.difference.template.xsl --> 
    <xsl:output method="xml" indent="yes"/>   

    <xsl:template match="/*"> 
     <xsl:copy> 
      <result1> 
       <xsl:call-template name="date:difference"> 
        <xsl:with-param name="start" select="record[1]/@datetime"/> 
        <xsl:with-param name="end" select="'2010-04-04T16:48:15.501-05:00'"/> 
       </xsl:call-template> 
      </result1> 
      <result2> 
       <xsl:call-template name="date:difference"> 
        <xsl:with-param name="start" select="record[2]/@datetime"/> 
        <xsl:with-param name="end" select="'2010-04-04T16:48:15.501-05:00'"/> 
       </xsl:call-template> 
      </result2> 
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

結果:

<records> 
    <result1>P90D</result1> 
    <result2>-P275D</result2> 
</records> 

負差異將意味着第一個日期發生在第二個日期之後。

+0

好的解決方案。 +1 – LarsH 2011-01-06 19:09:25

+0

對於你們兩個人來說+1。 – 2011-01-06 21:15:17

+0

+1良好的資源。這覆蓋區域轉換,但使用命名模板(嚴格標準)將使**選擇節點**是一項困難的工作。 – 2011-01-06 23:03:01

0

我有同樣的問題,因爲你。我建了一個C#方法(因此這僅適用於淨XSLT):

<msxsl:script language="C#" implements-prefix="user"> 
    <![CDATA[ 
    public bool largerThan(DateTime dt0, DateTime dt1) { 
    return dt0 > dt1; 
    } 
    ]]> 
</msxsl:script> 

與命名空間

xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
xmlns:user="urn:my-scripts" 

和使用(從我的XSLT文檔片段)

<xsl:for-each select="../b:post[user:largerThan(@created,$created)]">