使用xslt将xml转换为html
问题描述:
我在做什么:我正在尝试使用xslt将xml转换为html。使用xslt将xml转换为html
问题:该程序执行没有任何错误,就会gproducing输出文件还,但它并没有将XML转换为HTML。我的猜测是xsl中的for
循环没有获取数据。
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是非常无情。这:
<xsl:for-each select="language-list/language">
需要是:
<xsl:for-each select="languages-list/language">
答
刚刚杀青语文-list不会使免费的程序错误。它失败,错误如下:
Error on line 7 of FileTwo.xsl:
java.lang.IllegalArgumentException: URI scheme is not "file"
TransformerException
net.sf.saxon.trans.XPathException: java.lang.IllegalArgumentException: URI scheme is not "file"
这是误导,因为它不指向实际问题。 问题在于“outputHTML”它应该是File或FileOutputStream类型。
我已经尝试使用文件,它的工作。 所以这种说法:
StreamResult out = new StreamResult(outputHTML);
被改写为:
StreamResult out = new StreamResult(new File(outputHTML));
Ofcourse进口的java.io.File
使用FileOutputStream中需要适当的代码调整和import语句。
来吧......你用根元素“languages-list”开始你的XML,但是你在XSLT中引用了“language-list”? – Seelenvirtuose
您可能想知道,在架构感知型XSLT 2.0中,编译时可能会发现这个微不足道的错误。 –
本文可能有所帮助:http://www.yegor256.com/2015/06/25/xml-data-xsl-views-takes-framework.html – yegor256