【问题标题】:After trasforming XML in HTML with XSLT, HTML tags get "stripped"使用 XSLT 在 HTML 中转换 XML 后,HTML 标记被“剥离”
【发布时间】:2012-10-11 15:50:36
【问题描述】:

我有一个 XML 文件,其中包含信息的所有节点都在 CDATA 中。这些信息可能使用一些 HTML 标记进行格式化,如下所示:

<EventList>
    <Text><![CDATA[<p>Some text <i>is</i> formatted! This is a character entity &#39;</p>]]></Text>
    <ShortText><![CDATA[Some other is only plain]]></ShortText>
    <!-- others more -->
</EventList>

我想在 (X)HTML 页面中使用 XSLT 对其进行转换:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:output 
  method="html" 
  doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
  media-type="application/xhtml+xml" 
  encoding="utf-8" 
  omit-xml-declaration="yes" 
  indent="no"
/>
  <xsl:template match="Text">
    <h2><xsl:copy-of select="text()"/></h2>
  </xsl:template>

  <xsl:template match="ShortText">
    <div><xsl:copy-of select="."/></div>
  </xsl:template>
</xsl:stylesheet>

但是应用这种转换会产生一种奇怪的行为。我在 XSLT 中放入的 HTML 标记已从浏览器正确解析和解释,但 CDATA 中的标记被去除了 &lt;&gt;&amp; 字符,从而产生以下输出:

<h2>pSome text iis/i formatted!  This is a character entity #39;/p</h2>
<div>Some other is only plain</div>

起初它看起来像是&lt;xsl:output&gt; 定义中的一个问题,但我仍然坚持这一点。我尝试使用简写 XPath . 和函数 text() 但输出是相同的。 任何建议表示赞赏!

【问题讨论】:

  • 附注:输出在 Firefox 和 InternetExplorer 上可见,但在 GoogleChrome 中不可见。

标签: html xml xslt xhtml


【解决方案1】:

您的 XML 表示 Text 元素的内容是一串没有标记的字符串,其中恰好包含许多 XML 分隔符,例如左尖括号和 & 号。您的样式表说将该字符串写为字符串,不带标记,因此符合标准的 HTML 处理器会这样做,产生类似于

的输出
<H2 xmlns="http://www.w3.org/1999/xhtml"
  >&lt;p&gt;Some text &lt;i&gt;is&lt;/i&gt; formatted! 
  This is a character entity &amp;#39;&lt;/p&gt;</h2>
<div xmlns="http://www.w3.org/1999/xhtml"
  ><ShortText xmlns="">Some other is only plain</ShortText></div>

我引入了换行符以使行更短。这不是您作为输出显示的内容,这本身就是暗示性的。

获得更好结果的最简单方法是让您的 XML 开始说出有关数据的真相:如果您希望 Text 元素包含一些 HTML 元素,例如 p 和 i,那么就这样做,然后使用标识转换你的那部分数据。

如果此 XML 的损坏设计是您遇到的问题,那么您可以通过使用 xsl:value-of 元素上的 disable-output-escaping 属性来解决损坏问题。 (警告:需要使用 disable-output-escaping 几乎总是表明设计中有问题。)此版本的 Text 模板生成输出,其中输入的字符串数据作为 XHTML 标记写出:

<xsl:template match="Text">
  <h2><xsl:value-of select="string(.)" 
                    disable-output-escaping="yes"/></h2>
</xsl:template>

【讨论】:

  • 感谢您的回复!我会尽快试试这个。遗憾的是 XML 源是从外部源获得的,我无法重新设计它。
  • 它工作正常!我很遗憾地发现 Opera 和 IE 正确显示了输出,但是 Firefox 缺乏对disable-output-escaping 的支持,所以我不得不退出这个解决方案并找到其他东西。奇怪的是 Chrome 显示一个空白页面,但此时我不太喜欢找到原因。感谢您的支持!
  • 对于 firefox,使用 xsl:copy-of 并确保在创建 xml 时不会转义 html,它会正常工作。更多信息在这里words.carey.geek.nz/2003/08/xslt-cdata-escaping.html
  • 据我所知,如果您想在 XML 中实际使用 HTML 代码,您只需在其中使用纯 HTML,即&lt;Text&gt;&lt;p&gt;Some text &lt;i&gt;is&lt;/i&gt; formatted! This is a character entity &amp;#39;&lt;/p&gt;&lt;/Text&gt;?
  • 圣殿骑士,是的,我就是这样做的。当然,其他人可能会做不同的事情并给出不同的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-23
  • 1970-01-01
  • 2014-03-08
  • 2012-09-29
相关资源
最近更新 更多