Re: [xsl] Help XSL Transformation of Data

Subject: Re: [xsl] Help XSL Transformation of Data
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Sat, 26 Sep 2009 12:28:57 +0200
Rajesh Jain wrote:

I need help to transform the XML data to plot a graph.

The metrics data has to be pulled outside and organized by Time.

The Metric Counter names (CPU, Disk, Memory) are dynamic, I mean, I could get five metrics next time.

Please tell me how to pull data by the Names and organize by Time.





<Chart-Data> <Root> <Item ID="Server"> <Statistics > <Item Time="1253419200000"> <Metrics> <CPU TotalValue="20.0"/ > <Disk TotalValue="10.0" / > <Memory TotalValue="20.0" / > </Metrics > </Item > <Item Time="1253419211000"> <Metrics> <CPU TotalValue="40.0"/ > <Disk TotalValue="60.0" / > <Memory TotalValue="10.0" / > </Metrics > </Item > </Statistics> </Item> </Root> <Chart-Data>

This has to be Transformed in this XSL output

<chart_data> <row> <null/> <string>10</string> <string>11</string> </row>

I don't understand where above 'row' comes from.


<row> <string>CPU</string> <number >20</number> <number >40</number> </row> <row> <string>Memory</string> <number>20</number> <number >10</number> </row> <row> <string>Disk</string> <number >10</number> <number>60</number> </row> </chart_data>

And I don't see where data is organized by time. So based on that all I can suggest is



<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">

<xsl:output indent="yes"/>

<xsl:key name="k1" match="Metrics/*" use="local-name()"/>

  <xsl:template match="Chart-Data">
    <chart_data>
      <xsl:for-each select="Root/Item/Statistics/Item[1]/Metrics/*">
        <row>
          <string><xsl:value-of select="local-name()"/></string>
          <xsl:for-each select="key('k1', local-name())">
            <number><xsl:value-of select="number(@TotalValue)"/></number>
          </xsl:for-each>
        </row>
      </xsl:for-each>
    </chart_data>
  </xsl:template>

</xsl:stylesheet>

which outputs

<chart_data>
   <row>
      <string>CPU</string>
      <number>20</number>
      <number>40</number>
   </row>
   <row>
      <string>Disk</string>
      <number>10</number>
      <number>60</number>
   </row>
   <row>
      <string>Memory</string>
      <number>20</number>
      <number>10</number>
   </row>
</chart_data>

which is what you described above, with the exception of the first 'row' element in your described output, as I can't relate that to input data.


--


	Martin Honnen
	http://msmvps.com/blogs/martin_honnen/

Current Thread