2011-04-11 76 views
0

我試圖通過XSLT使XML日誌文件更易讀。XSLT將Date與DateTime的日期部分比較

它在日誌內有幾個事件,時間是dateTime格式,並且想要選擇發生在特定(單個)日期的事件。

這裏是我的log.xml文件的摘錄:

<event> 
    <bag>168</bag> 
    <action>Check Out</action> 
    <time>2011-04-07T11:41:34.7219171-04:00</time> 
    <user>jroderick</user> 
    </event> 

    <event> 
    <bag>168</bag> 
    <action>Check In</action> 
    <time>2011-04-07T11:41:38.7079901-04:00</time> 
    <user>jroderick</user> 
    </event> 

    <event> 
    <bag>1147</bag> 
    <action>Check In</action> 
    <time>2011-04-07T14:27:14.0662271-04:00</time> 
    <user>jholby</user> 
    </event> 

在我​​因爲我要生成表我有以下幾點:每個事件一行。

<xsl:for-each select="log/event"> 
    <xsl:if test="???"> 
     <tr> 
     <td> 
      <xsl:value-of select="user"/> 
     </td> 
     <td> 
      <xsl:value-of select="time"/> 
     </td> 
     <td> 
      <xsl:value-of select="action"/> 
     </td> 
     </tr> 
    </xsl:if> 

我希望有一個相當簡單的方式,在2.0的功能來實現這一點,但我一直沒能找到任何東西。

試圖將dateTime轉換爲xs:date,但沒有任何運氣使用Saxon 9.3 HE for .Net。

http://saxon.sourceforge.net/

任何幫助將不勝感激!

回答

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" 
exclude-result-prefixes="xs"> 
    <xsl:template match="/"> 
     <result> 
      <xsl:for-each 
      select="log/event[ 
         xs:date(xs:dateTime(time)) 
         eq 
         xs:date('2011-04-07-04:00') 
        ]"> 
       <tr> 
        <td> 
         <xsl:value-of select="user"/> 
        </td> 
        <td> 
         <xsl:value-of select="time"/> 
        </td> 
        <td> 
         <xsl:value-of select="action"/> 
        </td> 
       </tr> 
      </xsl:for-each> 
     </result> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

<result> 
    <tr> 
     <td>jroderick</td> 
     <td>2011-04-07T11:41:34.7219171-04:00</td> 
     <td>Check Out</td> 
    </tr> 
    <tr> 
     <td>jroderick</td> 
     <td>2011-04-07T11:41:38.7079901-04:00</td> 
     <td>Check In</td> 
    </tr> 
    <tr> 
     <td>jholby</td> 
     <td>2011-04-07T14:27:14.0662271-04:00</td> 
     <td>Check In</td> 
    </tr> 
</result> 

注意:您的數據是xs:dateTime格式,所以你需要先投,因爲這。 做好照顧時區

+0

確認我應該想到最初投給xs:dateTime。真棒Alej! – Jimmerz28 2011-04-11 20:02:09

+0

@ Jimmerz28:我很高興這很有幫助。 – 2011-04-11 20:17:22

1

如果您只想根據日期進行選擇,並且您確定日期格式始終採用該格式,那麼使用字符串如何呢?節省您不必擔心日期時間等

<xsl:for-each select="//event[substring(time,1,10) = '2011-04-07']"> 
<xsl:value-of select="user"/> ... 
</xsl:for-each> 

你甚至可以去儘可能創建一個模板,並通過日期與-PARAM使用,如果你要在幾個地方使用它。