【问题标题】:Decode HTML encoded content using XSLT使用 XSLT 解码 HTML 编码的内容
【发布时间】:2011-12-02 22:26:28
【问题描述】:

我有一个网页,它在点击链接时执行一些 javascript。链接是:

<a
  href="javascript:void(0)"
  onclick="XsltTransform('category.xml','category.xslt');">Latest news</a>

javascript是:

<script type="text/javascript">
  function XsltTransform(xmlfile, xslfile) {
  var xml = document.implementation.createDocument("", "", null);
  var xslt = document.implementation.createDocument("", "", null);

  xml.async = false;
  xslt.async = false;

  xml.load(xmlfile);
  xslt.load(xslfile);

  var processor = new XSLTProcessor();
  processor.importStylesheet(xslt);

  var XmlDom = processor.transformToDocument(xml)

  var serializer = new XMLSerializer();
  var output = serializer.serializeToString(XmlDom.documentElement);

  var outputDiv = document.getElementById("contentbody");
  outputDiv.innerHTML = output;
  }
</script>

处理后的 XML 看起来很像:

<Content>
 <Body>&lt;p&gt;It may have taken over 12 years</Body>
</Content>

处理它的 XSL 是一个简单的 xsl:value-of 语句:

  <xsl:template match="/">
    <p>
      <xsl:value-of select="*/*/Body" disable-output-escaping="yes" />
    </p>
  </xsl:template>

问题是,无论我在 'value-of' 的 'disable-output-escaping' 属性中使用什么值,我总是得到这个渲染(如 Firefox Web 开发人员生成的源视图中所示):

&lt;p&gt;It may have taken over 12 years

我希望在渲染时对解码后的 HTML 块进行编码,我的印象是禁用输出转义允许这样做。

如何让这个非常原始的 XML 再次变成真正的 HTML?

【问题讨论】:

  • 您是否在样式表中将输出元素设置为 html?

标签: html xml xslt escaping


【解决方案1】:

在转换 ATOM XML 时遇到了类似的问题,其中帖子的内容包含转义的 HTML 标记。 disable-output-escaping 似乎适用于大多数浏览器,但不适用于 Firefox。因此,作为一种解决方法,在我的 XSLT 中,我将 class="renderhtml" 属性添加到所有有问题的输出节点,作为对 javascript 的提示。然后在变换后添加如下代码。

// work around for XSLT disable-output-escaping="yes" not working in Firefox
if (navigator.userAgent.indexOf("Firefox")!=-1) {
  // get all "renderhtml" hints (HTML escaped within CDATA/text) nodes, then unescape and render HTML code
  var nodes = document.getElementsByClassName("renderhtml");
  for (var i = nodes.length - 1; i >= 0; i--) {
    nodes[i].innerHTML = nodes[i].textContent;
  }
}

【讨论】:

    【解决方案2】:

    并非所有 XSLT 处理器都支持disable-output-escaping。 Firefox 就是其中之一。

    Firefox 存在一个未解决的错误,它缺乏对它的支持:Bug 98168 - (doe) not working

    【讨论】:

    • 你会推荐其他浏览器吗?最终,我实际上是在为 iOS 构建一个网络应用程序,所以这将由移动 safari 执行,但我们不允许在此处安装桌面 safari...
    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 2016-03-03
    • 2011-11-01
    • 2015-01-17
    • 2014-02-06
    • 2011-03-03
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多