代码之家  ›  专栏  ›  技术社区  ›  Andez

如何用Java实现XML与XSL的转换

  •  2
  • Andez  · 技术社区  · 14 年前

    它在原型阶段工作得很好,只有一小部分XSL位于大约50行左右。现在在“最终系统”中,当它执行转换时会出现错误 分支目标偏移量过大 .

    private String transformXML() {
        String formattedOutput = "";
        try {
    
            TransformerFactory tFactory = TransformerFactory.newInstance();            
            Transformer transformer =
                    tFactory.newTransformer( new StreamSource( xslFilename ) );
    
            StreamSource xmlSource = new StreamSource(new ByteArrayInputStream( xmlString.getBytes() ) );
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            transformer.transform( xmlSource, new StreamResult( baos ) );
    
            formattedOutput = baos.toString();
    
        } catch( Exception e ) {
            e.printStackTrace();
        }
    
        return formattedOutput;
    }
    

    我发现了一些关于这个错误的帖子,但不太确定该怎么办。
    我在代码方面做了什么错事吗?

    谢谢,

    安德仕

    4 回复  |  直到 14 年前
        1
  •  4
  •   dogbane    14 年前

    尝试 Saxon 相反。

    javax.xml.transform.TransformerFactory net.sf.saxon.TransformerFactoryImpl 在JVM的系统属性中。

        2
  •  3
  •   khachik    14 年前

    javax.xml.transform.Templates style = tFactory.newTemplates(xslSource);
    style.newTransformer().transform(...);
    
        3
  •  2
  •   Andez    14 年前

    我在网上看到一篇文章提到了阿帕奇·哈兰。所以我把罐子添加到我的项目中。尽管我没有直接引用代码中的任何XALAN类,但从那以后,一切都开始工作了。据我所知,它仍然应该使用jaxax.xml类。

        4
  •  0
  •   Gaʀʀʏ    11 年前

    作为Saxon的替代方案,您可以将大模板拆分为小模板。

    JVM的XSLT编译器“Xalan”转换成Java方法,以加快 转变。其中包含的Java字节码分支指令 Java方法的偏移量限制在32K以内。大模板定义 需要大于32K。因此这些样式表不能 转变。

    解决方案

    可以使用一个单独的Java方法,使用多个较小的模板 作为解决方案。一个很大的模板可以分解成多个较小的 模板通过使用“ call-template “元素。

    Size limitation for XSLT stylesheets .

    旁注:我只推荐这个作为 如果saxon不可用,因为这需要对xsl文件进行一些更改。