【发布时间】:2017-06-13 16:09:17
【问题描述】:
我有一个程序可以像这样编写一些 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>	</xsl:text>
<xsl:value-of select="./@primary_id" />
<xsl:text> </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">
当我的代码尝试执行转换时,它会抛出异常:
错误:“序言中不允许内容。” 错误:“com.sun.org.apache.xml.internal.utils.WrappedRuntimeException:prolog 中不允许内容。” javax.xml.transform.TransformerException:javax.xml.transform.TransformerException:com.sun.org.apache.xml.internal.utils.WrappedRuntimeException:prolog 中不允许内容。 在 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:749) 在 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:351) ...我不确定这是从哪里来的。上次发生在我身上的是字符集不匹配,但在这种情况下,我将文件编写为 UTF-8 并使用 StreamSource 加载它,我认为这会正确加载字符集,所以我不是确定转换失败的原因。
【问题讨论】:
-
报错信息不一样,但是原因和解决方法和这个问题的答案一样:Error: The processing instruction target matching “[xX][mM][lL]” is not allowed