1

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 でこれが解決されなかった理由を知りたいと思っています。

4

1 に答える 1

1

XSLT 2.0 を使用できる場合は、試すことができます

<script>
  <xsl:sequence select="unparsed-text('path/to/jqueryvNN.js')" />
</script>

これにより、jquery ライブラリ定義がテキストとしてコピーされ、必要に応じて HTML に出力されます。HTML出力方式を使っていますよね?より効率的で人間が読める方法で JavaScript をシリアル化するように XSLT を誘導するためにcdata-section-elements="script"(ドキュメントはこちら)を使用することもお勧めします。(ライブラリの標準の縮小版を使用している場合は、いずれにせよ、非常に人間が読めるというわけではありません。)

XSLT は js ファイルを解析する必要がないため、エスケープされていないアンパサンドなどについて不満を持つことはありません。

于 2012-12-10T16:04:49.903 に答える