0

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">&amp;</xsl:text><xsl:value-of select="."/>
</xsl:template>

注意:この回避策は特定の場合にのみ機能しますが、私はまだそれを特定しようとしています。

これはXalan2.7.1の既知の問題ですか?

より良いアプローチはありますか(DocumentFragmentを返すJava拡張機能を引き続き使用しています)?

4

1 に答える 1

1

Xalanについては特に知りませんが、Javaコードがエンティティまたは文字参照を含むテキストノードを作成しているのではなく、文字(&、#、1、6、0)を含むテキストノードを作成しているように見えます。 、;)。

返される文字列に文字160を含めるのが最も簡単ではないでしょうか。

Text t = document.createTextNode((char)160 + "");
于 2012-06-01T08:11:55.627 に答える