Java 获得;UTFDataFormatException:编码字符串太长“;在进行XML转换时

Java 获得;UTFDataFormatException:编码字符串太长“;在进行XML转换时,java,xml,apache,xslt,xalan,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 facto

我正在尝试使用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)

知道这里的问题是什么吗?有什么解决办法吗?

好的,回答我自己的问题:当使用DataOutputStream写入UTF数据时,每个块似乎有64kB的限制(因为两个字节用于存储要写入的数据的长度)。在我的例子中,问题是静态内容(嵌入式javascript)的长度超过64k。因此,我所做的是通过插入这些不起任何作用的xsl命令,将其压缩为小于64k的块:

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


是否需要使用
数据输出流
?我认为您可以生成HTML(应该是
编写器
或普通的
输出流
)。好的,
数据输出流
似乎是XSLT库内部使用的。这里()的人建议使用不同的XSLT实现(Saxon而不是Xalan,据说Xalan没有得到很好的维护)。我认为您可以将TransformerFactory配置为使用第三方库而不是内置库。如果您可以随意使用XSL,这是一个很好的实用答案。