2017-01-27 3 views
0

が、私はこのようないくつかのXMLファイルを書き込むプログラムを持っている:XSLのERR:「コンテンツはプロローグで許可されていません」 - 私が間違って得たものかわからないこの時間

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ファイルが大きいですが、彼らはOKになり、ここにあります1の最初の数行:私のコード変換を実行しようとすると

<?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をロードして文字セットを正しくロードすると思っていました。変換は失敗しています。

+1

エラーメッセージは異なりますが、原因と救済策はこの質問の答えにあるものと同じです:[**エラー:処理命令ターゲット "\ [xX \ ] \ [mM \] \ [1L \] "は許可されていません**](http://stackoverflow.com/questions/19889132/error-the-processing-instruction-target-matching-xxmmll-is-not-allowed ) – kjhughes

+0

おそらく関連:http://stackoverflow.com/questions/4569123/content-is-not-allowed-in-prolog-saxparserexception –

+0

[Error: "[xX \] \ [[ mM \] \ [1L \] "は許可されていません](http://stackoverflow.com/questions/19889132/error-the-processing-instruction-target-matching-xxmmll-is-not-allowed) –

答えて

0

実際のソリューションは、XMLファイルとは何の関係もありませんでした。私が使用していたライブラリには、有効なXMLファイルの代わりにディレクトリへのパスを返すバグがありました。私はこの質問を削除しようとしましたが、回答があったので、できません。私は今、愚かな気がします...

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は、あなたのニーズに十分であることが明らかになりました。 XMLソースファイルの先頭に(彼らは一目で確認することが困難なため)空白文字のために特別に確認してください:XMLヘッダーが前に、いくつかの文字がある場合

+0

あなたはそうですね、私はXSLT 2は必要ありません。私はそれがテンプレートから含まれていたと思います。さて、 "1.0"に変更しましたが、同じエラーが発生します。 – FrustratedWithFormsDesigner

+0

@FrustratedWithFormsDesigner:それを読んで、すみません。しかしそれはちょうどランダムなショットでした;-) – zx485

+0

とにかく良い点でした。 XSLTバージョンの不一致は、通常、私はそれを見てからしばらくしているが、別のエラーを生成すると思う。 – FrustratedWithFormsDesigner

0

通常、このエラーは発生します。

+1

興味深い考えです。ファイルの先頭にUniCode [BOM](https://en.wikipedia.org/wiki/Byte_order_mark)もチェックすることをお勧めします。 – zx485

+0

@ zx485はい、そうです。これには16進エディタが便利です。その場合、修正する方法は、ソースXMLを読み込むときに適切な**エンコーディング**を指定することです: 'Source xmlSource = new StreamSource(new InputStreamReader(new FileInputStream(this.pathToFile.toFile())) "UTF-8")); ' –