在进行XML转换时获取“UTFDataFormatException:编码字符串太长”

时间:2015-11-16 09:03:58

标签: java xml apache xslt xalan

我正在尝试使用XML转换生成HTML文件(我有一个XSL和XML文件作为输入)。我使用Java 8中的标准API(javax.xml.transform。*)来初始化变换器:

    String xslFile = "my_file.xsl";

    // Create transformer factory
    TransformerFactory factory = TransformerFactory.newInstance();

    // Use the factory to create a template containing the xsl file
    Templates template = factory.newTemplates(new StreamSource(
            new FileInputStream(xslFile)));

当XSL文件很小时,一切正常。但是当我在XSL文件中嵌入大量的javascript时,我会在factory.newTemplates()行上跟踪异常:

java.io.UTFDataFormatException: encoded string too long: 98793 bytes
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:364)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
at com.sun.org.apache.bcel.internal.classfile.ConstantUtf8.dump(ConstantUtf8.java:128)
at com.sun.org.apache.bcel.internal.classfile.ConstantPool.dump(ConstantPool.java:233)
at com.sun.org.apache.bcel.internal.classfile.JavaClass.dump(JavaClass.java:327)
at com.sun.org.apache.bcel.internal.classfile.JavaClass.dump(JavaClass.java:312)
at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.dumpClass(XSLTC.java:905)
at com.sun.org.apache.xalan.internal.xsltc.compiler.Stylesheet.translate(Stylesheet.java:739)
at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:493)
at com.sun.org.apache.xalan.internal.xsltc.compiler.XSLTC.compile(XSLTC.java:568)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:977)
at gov.nasa.gsfc.drl.rtstps.report.ReportUtil.main(ReportUtil.java:158)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

任何想法这里有什么问题,有没有解决方法?

1 个答案:

答案 0 :(得分:1)

好的,回答我自己的问题:使用DataOutputStream写入UTF数据时,每个块似乎有64kB的限制(因为两个字节用于存储要写入的数据的长度)。我的问题是静态内容(嵌入式javascript)超过64k。所以我做的是通过插入这些什么都不做的xsl命令将它制成小于64k的块:

<xsl:if test="1 > 2">
</xsl:if>