我试图通过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。
非常感谢任何帮助!
答案 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传递日期。