DocumentFragmentを返すXalanJava拡張機能があります。
私のXSLTでは、次のようなもので呼び出します。
<xsl:copy-of select="java:org.foo.myMethod($a, $b)" />
問題は、ドキュメントフラグメントにエンティティを含むテキストノード(「&#160;」など)が含まれている場合、これが&amp;#160;として挿入されることです。
テキストノードは返されるXMLのツリーの一部にすぎないため、文字列ではなくDocumentFragmentを返す必要があることに注意してください。
私はこの問題を次のように回避しています:
Javaコードの場合:
Element amp = document.createElement("amp");
xhtmlBlock.appendChild(amp);
Text t = document.createTextNode("#160;");
amp.appendChild(t);
XSLTの場合:
<xsl:apply-templates select="java:org.foo.myMethod($a, $b)" mode="amp-workaround" />
<xsl:template match="@*|node()" mode="amp-workaround">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="amp-workaround" />
</xsl:copy>
</xsl:template>
<xsl:template match="amp" mode="amp-workaround">
<xsl:text disable-output-escaping="yes">&</xsl:text><xsl:value-of select="."/>
</xsl:template>
注意:この回避策は特定の場合にのみ機能しますが、私はまだそれを特定しようとしています。
これはXalan2.7.1の既知の問題ですか?
より良いアプローチはありますか(DocumentFragmentを返すJava拡張機能を引き続き使用しています)?