Here is the xsl I use to transform &quot;rrdtool xport&quot; output to CSV.&nbsp; <br><br>This works with rrdtool 1.2 but rrdtool 1.3 xport presently spits out invalid XML which breaks most stylsheet processors.<br><br>The only problem is that Excel doesn&#39;t understand &quot;seconds since the epoch.&quot;&nbsp; Does anyone know how to transform &quot;seconds since the epoch&quot; to a date format Excel will understand, using pure XSL only?<br>
<br>I used xsltproc linux command-line.&nbsp; I have not tried others.&nbsp; Please send feedback.<br><br>&lt;xsl:stylesheet version=&quot;1.0&quot; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsl=&quot;<a href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</a>&quot;&gt;<br>
<br>&lt;!-- This makes xsltproc skip the xml headers, for parsing xml into flat text --&gt;<br>&lt;xsl:output method=&quot;text&quot; version=&quot;1.0&quot; encoding=&quot;iso-8859-1&quot; indent=&quot;no&quot;/&gt;<br><br>
&lt;xsl:template match=&quot;/&quot;&gt;<br>&nbsp; &lt;xsl:text&gt;&quot;Timestamp&quot;,&lt;/xsl:text&gt;<br>&nbsp; &lt;xsl:for-each select=&quot;xport/meta/legend/entry&quot;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;&quot;&lt;/xsl:text&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select=&quot;.&quot;/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;&quot;&lt;/xsl:text&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:if test=&quot;position()!=last()&quot;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;,&lt;/xsl:text&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:if&gt;<br>
&nbsp; &lt;/xsl:for-each&gt;<br>&nbsp; &lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;<br>&nbsp; &lt;xsl:for-each select=&quot;xport/data/row&quot;&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;&quot;&lt;/xsl:text&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select=&quot;t&quot;/&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;&quot;&lt;/xsl:text&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;,&lt;/xsl:text&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:for-each select=&quot;v&quot;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;&quot;&lt;/xsl:text&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- replace NaN with blank --&gt;<br>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:if test=&quot;. != &#39;NaN&#39;&quot;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select=&quot;.&quot;/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:if&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;&quot;&lt;/xsl:text&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:if test=&quot;position()!=last()&quot;&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;,&lt;/xsl:text&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:if&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:for-each&gt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;<br>&nbsp; &lt;/xsl:for-each&gt;<br>&lt;/xsl:template&gt;<br><br>
&lt;/xsl:stylesheet&gt;<br><br><br>