【问题标题】:How to convert XML to HTML using XSLT in Java如何在 Java 中使用 XSLT 将 XML 转换为 HTML
【发布时间】:2013-11-06 11:59:33
【问题描述】:

我想借助 XSLT 将 XML 文件转换为 HTML 文件。但我收到一个错误,即

javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException:无效 1 字节 UTF-8 序列的字节 1。

XML 文件

<?xml version="1.0"?>
<Company>
    <Info>
            <EmpId>1</EmpId>
            <EmpName>John</EmpName>
            <Age>25</Age>
          <Salary>20000</Salary>
   </Info>
    <Info>
            <EmpId>2</EmpId>
            <EmpName>Tony</EmpName>
            <Age>27</Age>
            <Salary>23000</Salary>
    </Info>
    <Info>
            <EmpId>3</EmpId>
            <EmpName>Eithen</EmpName>
            <Age>29</Age>
            <Salary>25000</Salary>
    </Info>
</Company>

XSL 文件

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="/">
      <html>
         <body>
            <h1>Company Details</h1>
            <table border="1">
               <tr>
                  <th>EmpId</th>
                  <th>EmpName</th>
                  <th>Age</th>
                  <th>Salary</th>
               </tr>
               <xsl:for-each select="Company/Info">
                  <tr>
                     <td>
                        <xsl:value-of select="EmpId" />
                     </td>
                     <td>
                        <xsl:value-of select="EmpName" />
                     </td>
                     <td>
                        <xsl:value-of select="Age" />
                     </td>
                     <td>
                        <xsl:value-of select="Salary" />
                     </td>
                  </tr>
               </xsl:for-each>
            </table>
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

Java 代码

public class TransInfoHtml 
{
public static void main(String args[])
{
try {
        TransformerFactory tFactory=TransformerFactory.newInstance();

        Source xslDoc=new StreamSource("files/NewStylesheet.xsl");
        Source xmlDoc=new StreamSource("D:/Demo.xml");

        String outputFileName="CompanyInfo.html";

        OutputStream htmlFile=new FileOutputStream(outputFileName);
        Transformer trasform=tFactory.newTransformer(xslDoc);
        trasform.transform(xmlDoc, new StreamResult(htmlFile));
    } 
    catch (FileNotFoundException e) 
    {
        e.printStackTrace();
    }
    catch (TransformerConfigurationException e) 
    {
        e.printStackTrace();
    }
    catch (TransformerFactoryConfigurationError e) 
    {
        e.printStackTrace();
    }
    catch (TransformerException e) 
    {
        e.printStackTrace();
    }
}
}

【问题讨论】:

    标签: java xml xslt xslt-1.0


    【解决方案1】:

    对我来说,这看起来像是一个编码问题。尽量确保文件在所有情况下都正确编码。

    例如,将encoding="UTF-8" 添加到您的 XML 和 XSLT 文件中。但请注意,这只是一个声明 - 它不会更改字符本身。

    此外,您可以将您的 XML 内容复制到一个简单的编辑器中,并将其显式保存为 UTF-8。 例如,如果您使用的是 Windows,请将内容复制到记事本中,然后点击“另存为...”。在文件对话框中,您可以从下拉列表中选择“UTF-8”。

    【讨论】:

      【解决方案2】:

      您的代码运行良好。在问题中stylesheet 节点未关闭。

      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:template match="/">
          ---
         </xsl:template>
      </xsl:stylesheet>
      

      还要检查 xsl 路径是否正确或通过测试

      Source xslDoc=new StreamSource("D:/NewStylesheet.xsl");`
      

      【讨论】:

      • UTF-8 错误已解决。现在它显示 ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: 实体名称必须紧跟在实体引用中的 '&' 之后。我检查了 XML 文件。它不包含特殊字符,所有标签的层次结构都是正确的。请帮助
      【解决方案3】:

      对于将 XHTML 页面转换为 HTML 的特殊情况,我们可以使用 dom4j API 中的 HTMLWriter

      @Test
      public void givenXHTML_whenWrite_thenGetHTML() throws Exception {
          String xml = "<?xml version='1.0' encoding='UTF-8' ?>" +
            "<html> <body><![CDATA[First&nbsp;test]]> " +
            "<img alt=\"W3C\" height=\"48\" width=\"72\" src=\"http://www.w3.org/Icons/w3c_home\" />" +
            "</body> </html>";
          Document document = DocumentHelper.parseText(xml);
          StringWriter buffer = new StringWriter();
          HTMLWriter writer = new HTMLWriter(buffer);
          String expects = "\n<html>\n" +
            "  <body>First&nbsp;test\n    "
            + "<img alt=\"W3C\" height=\"48\" width=\"72\" src=\"http://www.w3.org/Icons/w3c_home\">\n  "
            + "</body>\n" + "</html>\n";
      
          writer.write(document);
          String output = buffer.toString();
      
          assertThat(output).isEqualTo(expects);
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-09
        • 1970-01-01
        • 2012-02-14
        • 2014-03-08
        • 2012-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多