C# XSLT将日期与日期时间的日期部分进行比较

C# XSLT将日期与日期时间的日期部分进行比较,c#,.net,datetime,xslt,xslt-2.0,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> <u

我试图通过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>

我希望在2.0函数中有一种相当简单的方法来实现这一点,但我一直找不到任何东西

试图将dateTime强制转换为xs:date,但在使用Saxon 9.3 for.Net时没有任何运气


任何帮助都将不胜感激

如果您只想根据日期进行选择,并且您确定日期格式始终是该格式,那么只处理字符串如何?省去了你对约会时间等的担心

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

...

您甚至可以创建一个模板,如果要在几个地方使用它,还可以在using with param中传递日期。

如果您只想根据日期进行选择,并且您确定日期格式始终是该格式,那么只使用字符串如何?省去了你对约会时间等的担心

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

...

您甚至可以创建一个模板,如果要在几个地方使用它,还可以将日期传递到using with param中。

此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>

约德里克
2011-04-07T11:41:34.7219171-04:00
退房
约德里克
2011-04-07T11:41:38.7079901-04:00
登记入住
霍尔比
2011-04-07T14:27:14.0662271-04:00
登记入住

注意:您的数据采用
xs:dateTime
格式,因此您需要先按此格式转换一定要注意时区

此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>

约德里克
2011-04-07T11:41:34.7219171-04:00
退房
约德里克
2011-04-07T11:41:38.7079901-04:00
登记入住
霍尔比
2011-04-07T14:27:14.0662271-04:00
登记入住

注意:您的数据采用
xs:dateTime
格式,因此您需要先按此格式转换请注意时区

确认我最初应该考虑将其转换为xs:dateTime。太棒了,阿莱杰@Jimmerz28:我很高兴它对我有帮助。我本应该想到最初投到xs:dateTime的。太棒了,阿莱杰@Jimmerz28:我很高兴这对我有帮助。