2014-01-27 195 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語句。