0

我有一个返回 DocumentFragment 的 Xalan Java 扩展。

在我的 XSLT 中,我使用以下内容调用它:

<xsl:copy-of select="java:org.foo.myMethod($a, $b)"  /> 

问题是文档片段包含一个包含实体的文本节点,例如“ ”,它被插入为 &#160;

请注意,我确实需要返回 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 扩展)?

4

1 回答 1

1

我不是特别了解 Xalan,但在我看来,您的 Java 代码不是在创建包含实体或字符引用的文本节点,而是在创建包含字符(&、#、1、6、0)的文本节点, ;)。

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

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