Содержимое текстового узла экранировано расширением Xalan

У меня есть расширение 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?

Есть ли лучший подход (все еще использующий расширения Java, которые возвращают DocumentFragment)?


person JasonPlutext    schedule 01.06.2012    source источник
comment
Наличие disabled-output-escaping=yes было бы достаточным при расширении обычного контента без необходимости этого обходного пути, но я думаю, вы сделали это в первую очередь, верно?   -  person neu-rah    schedule 01.06.2012


Ответы (1)


Я не знаю Xalan конкретно, но мне кажется, что ваш код Java не создает текстовый узел, содержащий ссылку на объект или символ, он создает текстовый узел, содержащий символы (&, #, 1, 6, 0 , ;).

Не проще ли просто включить символ 160 в возвращаемую строку:

Text t = document.createTextNode((char)160 + "");
person Michael Kay    schedule 01.06.2012
comment
Да, после тестирования различных перестановок (возврат строк или фрагментов документа, проталкивание результата через дополнительные расширения) я также обнаружил, что единственное, что работает надежно, — это избегать символьных объектов и вставлять UTF-8 для nbsp (\ u00A0), маркер (•) и т. д. в конце Java. Спасибо! - person JasonPlutext; 06.06.2012