【问题标题】:XSLT Compare Date to a Date portion of DateTimeXSLT 将日期与 DateTime 的日期部分进行比较
【发布时间】:2011-04-11 17:55:43
【问题描述】:

我正在尝试通过 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 函数中有一种相当简单的方法来实现这一点,但我找不到任何东西。

尝试使用 Saxon 9.3 HE for .Net 将 dateTime 转换为 xs:date 但没有任何运气。

http://saxon.sourceforge.net/

任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    这个 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格式,所以你需要先转换成this。 注意时区

    【讨论】:

    • Ack 我应该想到最初转换为 xs:dateTime。真棒阿莱杰!
    • @Jimmerz28:我很高兴它有帮助。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-12
      • 2020-05-20
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多