2014-01-27 146 views
3

我在做什么:我正在尝试使用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> 
+5

来吧......你用根元素“languages-list”开始你的XML,但是你在XSLT中引用了“language-list”? – Seelenvirtuose

+3

您可能想知道,在架构感知型XSLT 2.0中,编译时可能会发现这个微不足道的错误。 –

+0

本文可能有所帮助:http://www.yegor256.com/2015/06/25/xml-data-xsl-views-takes-framework.html – yegor256

回答

12

XML是非常无情。这:

 <xsl:for-each select="language-list/language"> 

需要是:

 <xsl:for-each select="languages-list/language"> 
0

刚刚杀青语文-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语句。