Рендеринг HTML-тегов из тега CDATA в XSL - PullRequest
11 голосов
/ 31 марта 2009

У меня есть тег CDATA в моем XML-коде, который содержит некоторые гиперссылки.

<smartText><![CDATA[
Among individual stocks, the top percentage gainers in the S.&P. 500 are
<a href ='http://investing.domain.com/research/stocks/snapshot
/snapshot.asp?ric=LNC'>Lincoln National Corp</a> and 
<a href ='http://investing.domain.com/research/stocks/snapshot
/snapshot.asp?ric=PLD'>ProLogis</a>.]]>
</smartText>

Я пытаюсь преобразовать его в HTML-страницу следующим образом ...

<p class="smartText">
    <xsl:copy-of select="marketSummaryModuleData/smartText"/>                                    
</p>    

К сожалению, вывод на страницу отображается в виде чистого текста, а не в виде HTML.

Among individual stocks, the top percentage gainers in the S.&P. 500 are <a href ='http://investing.businessweek.com/research/stocks/snapshot/snapshot.asp?ric=PLD'>ProLogis</a> and <a href ='http://investing.businessweek.com/research/stocks/snapshot/snapshot.asp?ric=LNC'>Lincoln National Corp</a>.

Раздел CDATA создается из классической страницы ASP, поэтому фактический вывод XML не содержит раздел CDATA. Может ли это быть частью проблемы? Я не могу получить информацию для отображения на странице. Я пробовал несколько решений, предлагаемых поиском в Google, таких как disable-escape-tags, xsl: copy-of, xsl: value-of и т.

Спасибо

Ответы [ 3 ]

11 голосов
/ 31 марта 2009
<p class="smartText">
  <xsl:value-of 
    select="marketSummaryModuleData/smartText" 
    disable-output-escaping="yes"
  />
</p>

EDIT: Как @Randell указывает в комментариях, disable-output-escaping присутствует не во всех процессорах XSLT. Например, тот в Firefox не поддерживает этот атрибут. Выше не будет работать для этих процессоров. Все автономные XSLT-процессоры, которые я знаю, поддерживают его.

6 голосов
/ 31 марта 2009

Вы должны исправить XML так, чтобы желаемый HTML (и он должен быть правильно сформированным XML) не содержался в разделе CDATA .

Любой раздел CDATA является лишь частью узла text (), и процессор XSLT рассматривает его как таковой.

Размещение разметки в CDATA общепризнанно считается плохой практикой, и сообщаемая проблема является одним из типичных результатов.

DOE (отключение-выход-экранирование) - это дополнительная функция в XSLT, которая не гарантируется для реализации и дает одинаковые ожидаемые результаты на разных процессорах XSLT.

Цитировать W3C XSLT Spec .:

"An XSLT processor is not required to support disabling output escaping. If an xsl:value-of or xsl:text specifies that output escaping should be disabled and the XSLT processor does not support this, the XSLT processor may signal an error; if it does not signal an error, it must recover by not disabling output escaping. "

и

"Since disabling output escaping may not work with all XSLT processors and can result in XML that is not well-formed, it should be used only when there is no alternative."

0 голосов
/ 22 октября 2015
<xsl:for-each select="marketSummaryModuleData/smartText">
    <xsl:copy-of select="node()"/>
</xsl:for-each>

<smartText>
Among individual stocks, the top percentage gainers in the S.&P. 500 are
<a href ='http://investing.domain.com/research/stocks/snapshot
/snapshot.asp?ric=LNC'>Lincoln National Corp</a> and 
<a href ='http://investing.domain.com/research/stocks/snapshot
/snapshot.asp?ric=PLD'>ProLogis</a>.
</smartText>
...