HTML внутри XML CDATA конвертируется с помощью скобок <и> - PullRequest
2 голосов
/ 30 ноября 2010

У меня есть пример XML:

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample>

Я использую ASP для вывода этого XML с использованием таблицы стилей примерно так:

Set xmlHttp = Server.CreateObject("Microsoft.XMLHTTP")
xmlHttp.open "GET", URLxml, false
xmlHttp.send()

Set xslHttp = Server.CreateObject("Microsoft.XMLHTTP")
xslHttp.open "GET", xXsl, false
xslHttp.send()   

Set xmlDoc = Server.CreateObject("MICROSOFT.XMLDOM")
Set xslDoc = Server.CreateObject("MICROSOFT.XMLDOM")
xmlDoc.async = false
xslDoc.async = false
xmlDoc.Load xmlHttp.responseXML
xslDoc.Load xslHttp.responseXML

Response.Write xmlDoc.transformNode(xslDoc)

Однако, как только это написано, вывод HTML отображается как:

Line 1&lt;br /&gt;Line 2&lt;br /&gt;Line 3

Я вижу, что ASP конвертирует скобки в коде, но я не уверен почему. Есть мысли?

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

У меня есть пример XML:

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample>

Это элемент sample с текстовым узлом child.

Предположим, вы применяете преобразование личности. Тогда результат будет:

<sample>Line 1&lt;br /&gt;Line 2&lt;br /&gt;Line 3&lt;br /&gt;</sample>

Почему? Поскольку текстовые узлы и значения атрибутов имеют специальные символы &, < и >, экранирующие их как символьные объекты.

EDIT : Конечно, вы можете использовать DOE ... Но, кроме того, что это опциональная функция , результатом будет текстовый узел, несмотря ни на что (без кодирования персонажи сущности). Вам понадобится другой fser анализатора (это может быть полезно при выводе и кодировании фрагмента HTML в (X) HTML-документ, как в каналах, с риском неправильного вывода ...).

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="sample">
        <p>
            <xsl:value-of select="." disable-output-escaping="yes"/>
        </p>
    </xsl:template>
</xsl:stylesheet>

Выход:

<p>Line 1<br />Line 2<br />Line 3<br /></p>

Отображать как (фактическая разметка):

Строка 1
Строка 2
Строка 3

1 голос
/ 30 ноября 2010

Думайте, что это XSL-преобразование, которое вызывает у вас проблемы.Вы должны иметь возможность отредактировать свой документ .xsl, исправив это следующим образом:

<xsl:template match=".">
  <xsl:value-of select="." disable-output-escaping="yes" />
  <!-- ... other XSL business here ... -->
</xsl:template>

Я краду с Эта страница об отключении выхода, выходящем из .

Длязапись, которую я ненавижу XML / XSL - решение в поисках проблемы.Вообще говоря, если вам нужно иметь дело с разметкой, я обнаружил, что XML / XSL только создает проблемы, потому что часто вы хотите иметь дело с фрагментами разметки, которые часто не являются допустимыми XML, поэтому вы оборачиваете CDATA вокруг него, и тогда возникает весельепереживает.

Обновление

ОК, поэтому вышеприведенное не работает.Конечно, не знал, как выглядит XSL, пока не был добавлен комментарий к вопросу.Следующее работает (идея из этой ветки форума ):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" />
    <xsl:template match=".">
        <xsl:value-of select="sample"  />
    </xsl:template>
</xsl:stylesheet>

Ключ - <xsl:output method="text" />.

Также, для отрицательного голосования, прокомментируйте почему.

1 голос
/ 30 ноября 2010

В дополнение к объяснению @ Alejandro, вот лучшее из возможных решений:

Никогда не размещайте разметку в текстовом (CDATA) узле .

Вместо:

<sample><![CDATA[Line 1<br />Line 2<br />Line 3<br />]]></sample>

всегда создайте:

<sample>Line 1<br />Line 2<br />Line 3<br /></sample>

Помните : размещение разметки внутри CDATA приводит к ее потере.

...