xsl пытается вывести '<' вместо '& lt;'
Обновить:
Проблема все еще сохраняется, хотя она не совсем такая, как прежде. Ниже приведен пример того, что вводится, что выводится и что я хочу получить
Пример ввода:
&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>
Предполагаемый выход:
<p><span style="font-size: medium">Product description text</span></p>
,
Использование CDATA помогло, так как позволяет мне вводить '<', но, как видно из вышеприведенного вывода, даже при использовании escape-output-escape, оно изменилось в выводе
,
,
Оригинальный вопрос:
Я получаю сообщение об ошибке: "<, шестнадцатеричное значение 0x3C, недопустимый символ атрибута"
Я пытаюсь заменить все вхождения & lt; и & gt; с <и> соответственно.
Чтобы сделать это максимально простым, вот код для lt;:
<xsl:variable name="lt">
<xsl:text><</xsl:text>
</xsl:variable>
<xsl:variable name="lthex">&lt;</xsl:variable>
<xsl:copy-of select="ew:replacestring(products_description/node(),$lthex,$lt)"/>
Я пробовал разные вещи вместо текста, например, value-of и т. Д.
Я знаю, что нет ничего плохого в формате кода и связанном с ним коде vb, потому что я использую его несколько раз для замены и вывода в другом месте.
Однако проблема в том, что я хочу, чтобы <и> были буквально выходными данными, а не кодом, который затем просматривается браузером и изменяется
,
Если вам нужна дополнительная информация, просто спросите (я изо всех сил пытаюсь объяснить это очень хорошо)
Любая помощь будет оценена
3 ответа
<xsl:text disable-output-escaping="yes"><![CDATA[<]]></xsl:text>
Это потому что <
является незаконным (и именно поэтому ваше приложение жалуется). За >
, ты можешь использовать:
<xsl:text disable-output-escaping="yes">></xsl:text>
Оригинальная проблема
Пример ввода:
&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>
То, что у вас действительно есть, - это двойной экранированный ввод, так что вместо простого вывода текста с 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, и он не требует никаких функций расширения.
Редактировать: Похоже, вы пытаетесь взять сериализацию сериализации XML или HTML в качестве ввода вместо сериализации XML или HTML, и ожидаете, что она выведет сериализацию XML или HTML?
Правильнее было бы исправить ваш неверный ввод, но посмотрите, как удалить символы XML с помощью XSLT?
У вас здесь какое-то недопонимание. XSL принимает XML в качестве входных данных и выводит HTML или XML. <
представляется как <
в сериализованном HTML и XML.
Файл HTML или XML, который содержит <
то, что не запускает тег, является неправильной сериализацией (плохо сформированной).
<
это правильное представление <
в файле HTML или XML.
Файл HTML или XML - это только сериализация данных, которые он представляет. То есть он на один уровень ниже данных, которые он представляет. Вы должны думать о содержании HTML или XML как о том, что представляют данные (<
), а не как сериализация данных (<
).
Попробуйте вместо этого объяснить, почему вы думаете, что <
проблема, поэтому мы можем исправить недоразумение?