JARファイルを介して配布されるJavaデスクトップで作業しており、そのJARにはアプリケーションに必要なものがすべて含まれています。最初に XML ファイルを生成し、次に XSL ファイルを使用して XML を HTML に変換することにより、さまざまな内容の HTML レポートを生成するアプリケーション。レポートが生成されたら、それを 1 つのファイルにする必要があるため、使用するスクリプトはすべてファイルに含める必要があり、jQuery を使用したいと考えています。リソースフォルダーにjQueryファイルがあり、それを解析してXMLファイルに追加できますが、XSLを介してXMLをHTMLに変換するときに、次のエラーが発生します。
ERROR: 'The entity name must immediately follow the '&' in the entity reference.'
javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The entity name must immediately follow the '&' in the entity reference.
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The entity name must immediately follow the '&' in the entity reference.'
エラーを読むと、特殊文字をエンコードする必要があることがわかりますが、jQuery ファイル全体を手動でエンコードする準備ができていません。
だから私の最終目標はこれです:
1.) HTML レポートに次のものが必要です。
<script>
// the entire jQuery library
</script>
2.) 私のメイン アプリケーションは、1 つの JAR ファイルに完全に含まれている必要があります。
3.) jQuery ライブラリを XSL ファイルにコピー アンド ペーストしたくありません。これは機能しますが、ずさんなようです。
更新#1:
上記の3点で間違っていました。エラーが発生せずに、jQuery ライブラリを XSL ファイルにコピー/貼り付けできません。
java.io.UTFDataFormatException: encoded string too long: 239677 bytes
その直後に、よりコミカルなエラーが続きます。
javax.xml.transform.TransformerConfigurationException: This Templates does not contain a class with the name 'GregorSamsa'.
変身のグレゴールサムサ
更新#2:
私の XSL スタイルシートの冒頭は次のようになっています。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
<xsl:output method="html"/>
バージョン番号を a から a に変更し1.0
ました2.0
が、次のエラーが表示されます。
ERROR: 'Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:sequence''
javax.xml.transform.TransformerException: java.lang.RuntimeException: Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:sequence'
さらに、私の jQuery ファイルは XSL スタイルシートと同じ場所にあるので、次のようにするとうまくいくはずです (しかしうまくいきません)。
<xsl:sequence select="unparsed-text('jquery-1.8.3.min.js')" />
更新 #3:
ここで Java 用の Saxon をダウンロードし、JAR ファイルをアプリケーションに追加しました。Transformer factory への呼び出しを次のように変更します。
TransformerFactory f = new net.sf.saxon.TransformerFactoryImpl(); // was TransformerFactory.newInstance();
Transformer t = f.newTransformer( new StreamSource( Example.class.getResourceAsStream( "resource/report_style.xsl" ) ) );
Source s = new StreamSource( XMLFile );
Result r = new StreamResult( HTMLFile );
t.transform( s, r );
提案され<xsl:sequence select="unparsed-text('jquery-1.8.3.min.js')" />
たものを使用すると、元のエラーと同等のエラーが引き続き発生しますが、現在は Saxon パーサーを使用しています。
net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference.
SXXP0003: Error reported by XML parser: The entity name must immediately follow the '&' in the entity reference.
更新 #4:
私はこれでどこにも行けなかったので、HTMLファイルを作成した後に読み返し、JavaScriptを追加してから書き戻しました。これは余分な手順ですが、レポート生成時間の違いは認識できず、機能します。それでも、XSLT 2.0 でこれが解決されなかった理由を知りたいと思っています。