xsl пытается вывести '<' вместо '& lt;'

Обновить:

Проблема все еще сохраняется, хотя она не совсем такая, как прежде. Ниже приведен пример того, что вводится, что выводится и что я хочу получить

Пример ввода:

&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;Product description text&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;

Токовый выход:

&lt;p&gt;&lt;span style="font-size: medium"&gt;Product description text&lt;/span&gt;&lt;/p&gt;

Предполагаемый выход:

<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">&amp;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>

Оригинальная проблема

Пример ввода:

&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;Product description text&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;

Предполагаемый выход:

<p><span style="font-size: medium">Product description text</span></p>

То, что у вас действительно есть, - это двойной экранированный ввод, так что вместо простого вывода текста с disable-output-escaping="yes" вам нужно несколько способов сделать замену строк. Очевидно, что вы делаете замену с ew:replacestring() функция расширения. Проблема в том, что даже если вам удастся заменить &amp;lt; с <, результат по-прежнему только строка и < персонаж сбежал на выходе.

Ваш исходный текстовый код замены не был правильно сформирован, потому что < как таковой рассматривается как разметка. С помощью

<xsl:variable name="lt">
  <xsl:text><![CDATA[<]]></xsl:text>
</xsl:variable>

или же

<xsl:variable name="lt">
  <xsl:text>&lt;</xsl:text>
</xsl:variable>

эквивалентны и решить эту проблему. Однако это не помогает в проблеме, что символ замены по-прежнему выводится как ссылка на сущность. С помощью disable-output-escaping="yes" здесь в определении переменной также не влияет на эту проблему.

<xsl:variable name="lt">
  <xsl:text disable-output-escaping="yes">&lt;</xsl:text>
</xsl:variable>

<xsl:variable name="lt">
  <xsl:value-of select="&lt;" 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"/>

Другое решение без функций расширения

Я смог преобразовать ваш вклад

&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-size: medium&amp;quot;&amp;gt;Product description text&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;

к этому выводу

<p><span style="font-size: medium">Product description text</span></p>

с немного измененной версией шаблона замены аббревиатуры Джени Теннисон. В вашем случае документ, содержащий названия аббревиатур, будет выглядеть так

<acronyms>
    <acronym acronym="&amp;lt;">&lt;</acronym>
    <acronym acronym="&amp;gt;">></acronym>
    <acronym acronym="&amp;amp;">&amp;</acronym>
    <acronym acronym="&amp;apos;">'</acronym>
    <acronym acronym="&amp;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. < представляется как &lt; в сериализованном HTML и XML.

Файл HTML или XML, который содержит < то, что не запускает тег, является неправильной сериализацией (плохо сформированной).

&lt; это правильное представление < в файле HTML или XML.

Файл HTML или XML - это только сериализация данных, которые он представляет. То есть он на один уровень ниже данных, которые он представляет. Вы должны думать о содержании HTML или XML как о том, что представляют данные (<), а не как сериализация данных (&lt;).

Попробуйте вместо этого объяснить, почему вы думаете, что &lt; проблема, поэтому мы можем исправить недоразумение?

Другие вопросы по тегам