xsl пытается вывести '<', а не '<' - PullRequest
6 голосов
/ 12 июля 2011

Обновление:

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

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

&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 помогло, поскольку позволяет мне вводить '<', но, как видно из вышеприведенного вывода, даже при использовании disable-output-эскейпинг, он изменился в выводе </p>

.

.

Исходный вопрос:

Я получаю ошибку "" <",шестнадцатеричное значение 0x3C, недопустимый символ атрибута "</p>

Я пытаюсь заменить все вхождения <;и>;с <и> соответственно.

Чтобы сделать это максимально простым, вот код для 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)"/>

Я пробовал разные вещи вместо текста, например, значениеи т.д.

Я знаю, что нет ничего плохого в формате кода и связанном с ним коде vb, потому что я использую его несколько раз для замены и вывода в другом месте

Проблема с этим, хотяв том, что я хочу, чтобы <и> были буквально выходными данными, а не кодом, который затем просматривается браузером и изменяется

.

Если вам нужна дополнительная информация, просто спросите (я пытаюсьобъясните это очень хорошо)

Любая помощь будет оценена

Ответы [ 3 ]

10 голосов
/ 12 июля 2011
<xsl:text disable-output-escaping="yes"><![CDATA[<]]></xsl:text>

Это потому, что < недопустимо (и именно поэтому ваше приложение жалуется).Для > вы можете использовать:

<xsl:text disable-output-escaping="yes">></xsl:text>
4 голосов
/ 13 июля 2011

Исходная задача

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

&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, и он не требует никаких функций расширения.

0 голосов
/ 13 июля 2011

Редактировать: Похоже, вы пытаетесь взять сериализацию сериализации 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; является проблемой, чтобы мы могли исправить недоразумение?

...