What I am doing: I am trying to transform xml to html using xslt.
Question: The program is executing without any error, it is gproducing the output file also, but it does not transform the xml to html. My guess is that the for
loop in the xsl is not fetching the data.
XSLTTest.java
package JavaXSLTExample;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class XSLTTest {
public static void main(String[] args)
{
/*if (args.length != 3)
{
System.err.println("give command as follows : ");
System.err.println("XSLTTest data.xml converted.xsl converted.html");
return;
}*/
String dataXML = "C:\\Users\\Devrath\\Desktop\\XSL\\FileOne.xml";
String inputXSL = "C:\\Users\\Devrath\\Desktop\\XSL\\FileTwo.xsl";
String outputHTML = "C:\\Users\\Devrath\\Desktop\\XSL\\output1.html";
XSLTTest st = new XSLTTest();
try
{
st.transform(dataXML, inputXSL, outputHTML);
}
catch (TransformerConfigurationException e)
{
System.err.println("TransformerConfigurationException");
System.err.println(e);
}
catch (TransformerException e)
{
System.err.println("TransformerException");
System.err.println(e);
}
}
public void transform(String dataXML, String inputXSL, String outputHTML)
throws TransformerConfigurationException,
TransformerException
{
TransformerFactory factory = TransformerFactory.newInstance();
StreamSource xslStream = new StreamSource(inputXSL);
Transformer transformer = factory.newTransformer(xslStream);
StreamSource in = new StreamSource(dataXML);
StreamResult out = new StreamResult(outputHTML);
transformer.transform(in, out);
System.out.println("The generated HTML file is:" + outputHTML);
}
}
FileOne.xml
<languages-list>
<language>
<name>Kannada</name>
<region>Karnataka</region>
<users>38M</users>
<family>Dravidian</family>
</language>
<language>
<name>Telugu</name>
<region>Andra Pradesh</region>
<users>74M</users>
<family>Dravidian</family>
</language>
<language>
<name>Tamil</name>
<region>TamilNadu</region>
<users>61M</users>
<family>Dravidian</family>
</language>
<language>
<name>Malayalam</name>
<region>Kerela</region>
<users>33M</users>
<family>Dravidian</family>
</language>
<language>
<name>Hindi</name>
<region>Andaman and Nicobar Islands, North india, Parts of North east</region>
<users>442M</users>
<family>Indo Aryan</family>
</language>
<language>
<name>Assamese</name>
<region>Assam, Arunachal Pradesh</region>
<users>13M</users>
<family>Indo Aryan</family>
</language>
</languages-list>
FileTwo.xsl
<?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>
<h1>Indian Languages details</h1>
<table border="1">
<tr>
<th>Language</th>
<th>Family/Origin</th>
<th>No. of speakers</th>
<th>Region</th>
</tr>
<xsl:for-each select="language-list/language">
<tr>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="family"/></td>
<td><xsl:value-of select="users"/></td>
<td><xsl:value-of select="region"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Output.html
<html>
<body>
<h1>Indian Languages details</h1>
<table border="1">
<tr>
<th>Language</th><th>Family/Origin</th><th>No. of speakers</th><th>Region</th>
</tr>
</table>
</body>
</html>
XML is very unforgiving. This:
<xsl:for-each select="language-list/language">
needs to be:
<xsl:for-each select="languages-list/language">
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With