【问题标题】:Text node content escaped by Xalan extensionXalan 扩展转义的文本节点内容
【发布时间】:2012-06-01 00:08:17
【问题描述】:

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

在我的 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 扩展)?

【问题讨论】:

  • 具有 disable-output-escaping="yes" 在扩展普通内容时就足够了,不需要这种解决方法,但我想你一开始就这样做了,对吧?

标签: xml xslt xslt-1.0 xalan


【解决方案1】:

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

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

Text t = document.createTextNode((char)160 + "");

【讨论】:

  • 是的,在测试了各种排列(返回字符串或文档片段,通过进一步扩展推送结果)之后,我还发现唯一可靠的方法是避免字符实体,并插入 UTF-8对于 Java 端的 nbsp (\u00A0)、bullet (\u2022) 等。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-12-18
  • 2015-10-17
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多