我有一个Xalan Java扩展,它返回一个DocumentFragment。
在我的XSLT中,我用以下内容调用它:
<xsl:copy-of select="java:org.foo.myMethod($a, $b)" />
问题是,如果文档片段包含一个包含实体的文本节点,例如“&amp;#160;”,则会将其插入为&amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp; amp;
请注意,我确实需要返回DocumentFragment而不是字符串,因为该文本节点只是返回的XML树的一部分。
我正在解决此问题 如下:
在 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>
注意:此解决方法仅适用于某些情况,我仍在尝试确定。
这是Xalan 2.7.1中的已知问题吗?
是否有更好的方法(仍然使用返回DocumentFragment的Java扩展)?
答案 0 :(得分:1)
我不太了解Xalan,但它看起来好像你的Java代码没有创建包含实体或字符引用的文本节点,它正在创建一个包含字符的文本节点(&amp;,#,1 ,6,0,;)。
将字符160包含在返回的字符串中不是最简单的:
Text t = document.createTextNode((char)160 + "");