文本节点内容由Xalan扩展转义

时间:2012-06-01 00:08:18

标签: xml xslt xslt-1.0 xalan

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

注意:此解决方法仅适用于某些情况,我仍在尝试确定。

这是Xalan 2.7.1中的已知问题吗?

是否有更好的方法(仍然使用返回DocumentFragment的Java扩展)?

1 个答案:

答案 0 :(得分:1)

我不太了解Xalan,但它看起来好像你的Java代码没有创建包含实体或字符引用的文本节点,它正在创建一个包含字符的文本节点(&amp;,#,1 ,6,0,;)。

将字符160包含在返回的字符串中不是最简单的:

Text t = document.createTextNode((char)160 + "");
相关问题