Подтвердить что ты не робот

Рендеринг HTML-тегов из тега CDATA в XSL

У меня есть тег 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-тегов, xsl: copy-of, xsl: value-of и more.

Спасибо

4b9b3361

Ответ 1

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

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

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

DOE (disable-output-escaping) является необязательной функцией в 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."

Ответ 2

<p class="smartText">
  <xsl:value-of 
    select="marketSummaryModuleData/smartText" 
    disable-output-escaping="yes"
  />
</p>

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

Ответ 3

<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>