Исходная задача
Пример ввода:
<p><span style="font-size: medium">Product description text</span></p>
Предполагаемая мощность:
<p><span style="font-size: medium">Product description text</span></p>
То, что вам действительно кажется, - это двойной экранированный ввод, так что вместо простого вывода текста с помощью disable-output-escaping="yes"
вам понадобятся несколько способов замены строк. Очевидно, что вы выполняете замену с помощью ew:replacestring()
функции расширения. Проблема в том, что даже если вам удастся заменить &lt;
на <
, результатом будет только строка и символ <
будет экранирован на выходе.
Ваш исходный код замены не был правильно сформирован, потому что <
как таковая рассматривается как разметка. Использование
<xsl:variable name="lt">
<xsl:text><![CDATA[<]]></xsl:text>
</xsl:variable>
или
<xsl:variable name="lt">
<xsl:text><</xsl:text>
</xsl:variable>
эквивалентны и решают эту проблему. Однако это не помогает в проблеме, что символ замены все еще выводится как ссылка на сущность. Использование disable-output-escaping="yes"
здесь в определении переменной также не влияет на эту проблему.
<xsl:variable name="lt">
<xsl:text disable-output-escaping="yes"><</xsl:text>
</xsl:variable>
<xsl:variable name="lt">
<xsl:value-of select="<" disable-output-escaping="yes">
</xsl:variable>
Эти примеры кода не работают, потому что disable-output-escaping="yes"
действует только при сериализации значения, но не при назначении переменной.
Возможное исправление
Что вы можете попытаться сделать, это сохранить результат замены вашего текста в переменную
<xsl:variable name="replaced-text">
<xsl:copy-of select="ew:replacestring(products_description/node(),$lthex,$lt)"/>
</xsl:variable>
, а затем выведите значение этой переменной с помощью disable-output-escaping="yes"
<xsl:value-of select="$replaced-text" disable-output-escaping="yes"/>
Другое решение без функций расширения
Мне удалось преобразовать ваш ввод
&lt;p&gt;&lt;span style=&quot;font-size: medium&quot;&gt;Product description text&lt;/span&gt;&lt;/p&gt;
к этому выводу
<p><span style="font-size: medium">Product description text</span></p>
со слегка измененной версией Шаблон замены аббревиатуры Джени Теннисон . В вашем случае документ, содержащий названия аббревиатур, будет выглядеть так:
<acronyms>
<acronym acronym="&lt;"><</acronym>
<acronym acronym="&gt;">></acronym>
<acronym acronym="&amp;">&</acronym>
<acronym acronym="&apos;">'</acronym>
<acronym acronym="&quot;">"</acronym>
</acronyms>
Требуется модификация для изменения этой части примера кода
<acronym title="{$acronyms[1]}">
<xsl:value-of select="$acronym" />
</acronym>
чтобы выглядеть так
<xsl:value-of select="$acronyms[1]" disable-output-escaping="yes"/>
Этот шаблон должен работать в любой среде, потому что это XSLT 1.0, и он не требует никаких функций расширения.