XSLT将Date与DateTime的Date部分进行比较

时间:2011-04-11 17:55:44

标签: c# .net datetime xslt xslt-2.0

我试图通过XSLT使XML日志文件更具可读性。

它在日志中有几个事件,时间是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>

在我的log.xsl我想要生成的表格中有以下内容:每个事件一行。

<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 个答案:

答案 0 :(得分: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,因此您需要首先进行投射。 请注意时区

答案 1 :(得分:1)

如果您只想根据日期进行选择,并且您确定日期格式始终采用该格式,那么只使用字符串怎么样?节省您不必担心DateTime等。

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

如果你打算在几个地方使用它,你甚至可以创建一个模板,并使用with-param传递日期。