Использование отключения-вывода-экранирования при записи в переменную является давним источником проблем и противоречий, известных в рабочей группе XSL как проблема «липкого дела». Спецификация XSLT 1.0 гласит (в §16.4)
преобразование фрагмента результирующего дерева в число или строку также является ошибкой, если фрагмент результирующего дерева содержит текстовый узел, для которого экранирование было отключено.
Но Erratum E2 сообщает:
Когда корневой узел копируется с использованием элемента xsl: copy-of (см. [11.3 Использование значений переменных и параметров с xsl: copy-of]) и экранирование было отключено для потомка текстового узла этого корневого узла, тогда экранирование также должно быть отключено для результирующей копии этого текстового узла. Например,
<xsl:variable name="x">
<xsl:text disable-output-escaping="yes"><</xsl:text>
</xsl:variable>
<xsl:copy-of select="$x"/>
должен выдавать <
, а не <
.
То есть свойство disable-output-escaping имеет значение «sticky»: он сохраняется в переменной и повторно появляется после завершения копирования.
Это было отменено в XSLT 2.0: см. приложение J.1.4, позиция 20:
Ошибка дляВ XSLT 1.0 определено то, что стало известно как «липкое отключение-выход-экранирование»: в частности, что должна быть возможность использовать отключение-вывод-экранирование при записи узла во временное дерево, и что эта информация будет сохранена для использования приэтот же узел был позже скопирован в дерево конечных результатов и сериализован. XSLT 2.0 больше не определяет это поведение (хотя оно разрешает это по усмотрению реализации).
Учитывая это различие между спецификациями, не будет очень предсказуемым, что на самом деле делает конкретный процессор. эта ситуация. Но тогда всегда лучше держаться подальше от отключения-выхода-выхода.