使用XSL从XML源显示双编码字符串作为HTML

时间:2011-10-06 17:27:42

标签: html xslt encoding double

我有一个XML源,其中包含我需要使用XSL在网页中显示为HTML的内容。其中一个XML节点包含一个双“HTML编码”值。这是我需要输出HTML的那个。

原来的HTML输入是<p><strong>hello world</strong></p> 但它然后存储为两次HTML编码文本。

  • 原始版本:<p><strong>hello world</strong></p>
  • 第一个HTML编码:&lt;p&gt;&lt;strong&gt;hello world&lt;/strong&gt;&lt;/p&gt;
  • 第二个HTML编码:&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;hello world&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;

我只从XML源接收第二个HTML编码

<CONTENT>
   <RECORD>
      <OVERVIEW>&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;hello world&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;</OVERVIEW>
   </RECORD>
</CONTENT>

使用xsl输出到XSL中的html:输出开始了,我的xsl:value-of标签中的disable-output-escaping让我超过了一层HTML编码。

但是以下XSL:

<xsl:for-each select = "//CONTENT/RECORD">
   <xsl:value-of disable-output-escaping="yes" select = "OVERVIEW" />
</xsl:for-each>

仅返回:

&lt;p&gt;&lt;strong&gt;hello world&lt;/strong&gt;&lt;/p&gt;

它不会让我一直回到原始输入<p><strong>hello world</strong></p>

所以我一直在寻找一种方法来“加倍”或“禁用输出 - 逃避=”是“两次。”

我是如何在XSL中做到这一点的?

2 个答案:

答案 0 :(得分:1)

我的理解是你不能在XSLT中使用disable-output-escaping两次,这是一个不影响转换过程的序列化选项。您可以在序列化时注释输出节点不被转义,就是这样。如果您需要双重unescape,则需要预处理输入文档,或使用扩展功能。

答案 1 :(得分:1)

请记住,“unes​​capes”内容的操作被正确地称为解析,而“转义”它的操作称为序列化。因此,要执行两个级别的unescaping,请调用parse(parse(X))。在一些XSLT处理器(如Saxon)中可以使用扩展函数来执行parse()和serialize()操作,在其他处理器中,您可以自己编写。