У меня есть расширение 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">&</xsl:text><xsl:value-of select="."/>
</xsl:template>
Осторожно: этот обходной путь работает только в определенных случаях, которые я все еще пытаюсь определить.
Это известная проблема в Xalan 2.7.1?
Есть ли лучший подход (все еще использующий расширения Java, которые возвращают DocumentFragment)?