user3136030
user3136030

Reputation: 384

How to convert XML to XSL

I am trying to convert a xml file to xslt

My xml file is like this,

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="testxsl.xsl"?>
<doc>
<test>
    <field name="id">c8b102</field>
    <field name="created_at">2013-11-14T00:00:00Z</field>
    <field name="userid">userfirst</field>
    <field name="screenname">userfirst</field>
    <field name="status">open</field>
    <field name="contents">testing content</field>
    <field name="sentiment">positive</field>
    <field name="location">placename</field>
    <field name="source">local</field>
    <field name="url">test</field>
    <field name="keyword">test</field>
</test>
<test>
    <field name="id">c8b102</field>
    <field name="created_at">2013-11-14T00:00:00Z</field>
    <field name="userid">usersec</field>
    <field name="screenname">usersec</field>
    <field name="status">close</field>
    <field name="contents">test sec</field>
    <field name="sentiment">positive</field>
    <field name="location">place</field>
    <field name="source">local</field>
    <field name="url">test</field>
    <field name="keyword">test</field>
  </test>
  </doc>

I have written a xsl code(testxsl.xsl) for transformation

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Complaints</h2>
<table border="1">
<tr bgcolor="#9acd32">
  <th>Created Date</th>
  <th>UserID</th>
  <th>Screenname</th>
  <th>Status</th>
  <th>Contents</th>
  <th>Source</th>
  <th>URL</th>
</tr>
<xsl:for-each select="doc/test">
<tr>
  <td>
  <xsl:value-of select="date" />
  </td>
  <td>
  <xsl:value-of select="str[@name = 'userid']" />
  </td>
  <td>
  <xsl:value-of select="str[@name='screenname']" />
  </td>
  <td>
  <xsl:value-of select="str[@name='status']" />
  </td>
  <td>
  <xsl:value-of select="str[@name='contents']" />
  </td>
  <td>
  <xsl:value-of select="str[@name='source']" />
  </td>
  <td>
  <xsl:value-of select="str[@name='url']" />
  </td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

But i am getting only header part in the output with borders and all like below,

Created Date  UserID    Screenname  Status  Contents    Source  URL

I dont know what is the problem, my xsl file seems to be correct

Upvotes: 3

Views: 16333

Answers (1)

Mathias M&#252;ller
Mathias M&#252;ller

Reputation: 22647

There is no element named date in your input XML. Likewise, the elements inside test are not called str, but field.

Your XSLT code must of course correspond to the elements in your input XML.

Use the following stylesheet:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>Complaints</h2>
<table border="1">
<tr bgcolor="#9acd32">
  <th>Created Date</th>
  <th>UserID</th>
  <th>Screenname</th>
  <th>Status</th>
  <th>Contents</th>
  <th>Source</th>
  <th>URL</th>
</tr>
<xsl:for-each select="doc/test">
<tr>
  <td>
  <xsl:value-of select="field[@name='created_at']" />
  </td>
  <td>
  <xsl:value-of select="field[@name = 'userid']" />
  </td>
  <td>
  <xsl:value-of select="field[@name='screenname']" />
  </td>
  <td>
  <xsl:value-of select="field[@name='status']" />
  </td>
  <td>
  <xsl:value-of select="field[@name='contents']" />
  </td>
  <td>
  <xsl:value-of select="field[@name='source']" />
  </td>
  <td>
  <xsl:value-of select="field[@name='url']" />
  </td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Output

<html>
   <body>
      <h2>Complaints</h2>
      <table border="1">
         <tr bgcolor="#9acd32">
            <th>Created Date</th>
            <th>UserID</th>
            <th>Screenname</th>
            <th>Status</th>
            <th>Contents</th>
            <th>Source</th>
            <th>URL</th>
         </tr>
         <tr>
           <td>2013-11-14T00:00:00Z</td>
           <td>userfirst</td>
           <td>userfirst</td>
           <td>open</td>
           <td>testing content</td>
           <td>local</td>
           <td>test</td>
        </tr>
        <!--...-->
      </table>
   </body>
</html>

Rendered HTML

enter image description here

Upvotes: 2

Related Questions