XSL错误:“prolog中不允许内容” - 这次不确定我错了什么

时间:2017-01-27 21:13:42

标签: java xml xslt

我有一个编写一些XML文件的程序:

Path path = Paths.get(new URI("file://" + this.destination));
StringBuilder sb = new StringBuilder("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Responses>\n");
// Get a bunch of data from a remote web service
sb.append("</Responses>");
Files.write(path, sb.toString().getBytes(Charset.forName("UTF-8")), StandardOpenOption.CREATE);

读取文件的代码如下所示:

import javax.xml.transform.stream.StreamSource;
// ...
// Load XSLT
Source source = new StreamSource(this.getClass().getClassLoader().getResourceAsStream("my_transform.xsl"));
Transformer transformer = factory.newTransformer(source);
// set parameter
transformer.setParameter("db", dbName);
// Get input file
Source xmlSource = new StreamSource(this.pathToFile.toFile());
// Execute transform
transformer.transform(xmlSource, outputTarget);

变换本身很简单:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" indent="no" encoding="utf-8"
        media-type="text/plain" />
    <xsl:strip-space elements="*" />
    <xsl:param name="db" />
    <xsl:template match="/ELEMENT1/ELEMENT2/ELEMENT3/data[@dbname=$db]">
        <xsl:value-of select="../../@id" />
        <xsl:text>&#x9;</xsl:text>
        <xsl:value-of select="./@primary_id" />
        <xsl:text>&#10;</xsl:text>
    </xsl:template>
</xsl:stylesheet>

XML文件很大,但它们看起来还不错,这是一行的前几行:

<?xml version="1.0" encoding="utf-8"?>
<Responses>
<Response id="ID0000123">
  <opt>
    <data  primary_id="ID0000123-01" version="0">

当我的代码尝试执行转换时,它会抛出异常:

ERROR:  'Content is not allowed in prolog.'
ERROR:  'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.'
javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Content is not allowed in prolog.
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:749)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351)
...

我不确定这是从哪里来的。最后一次这发生在我身上是一个字符集不匹配,但在这种情况下,我将文件写为UTF-8并加载StreamSource,我认为它会正确加载字符集,所以我'我不确定转换失败的原因。

3 个答案:

答案 0 :(得分:1)

实际的解决方案与XML文件无关。我使用的库有一个错误,就是将路径返回到目录而不是有效的XML文件。我试图删除这个问题,但因为它已被回答,我不能。我现在肯定觉得很傻......

答案 1 :(得分:0)

一个问题可能是Java 8 TransformerFactory的方法

public abstract Transformer newTransformer(Source source)
    throws TransformerConfigurationException

.transform只能处理XSLT-1.0样式表 但是您正在尝试处理XSLT-2.0样式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ...

快速浏览一下XSLT,可以看出XSLT-1.0足以满足您的需求。

答案 2 :(得分:0)

当XML标题中有一些字符 时,通常会发生此错误:在开头专门检查空白字符(因为它们很难一目了然) XML源文件。