3

我真的需要这个问题的答案。我正在开发一个项目,该项目使用 XML 制作页面,然后使用 XSLT 将其生成网页。这是一个代码示例:

 public function transform ($xml) {
  $proc = new XSLTProcessor;
  $proc->importStyleSheet ($this->xsl);
  $output = $proc->transformToXML ($xml);
  return $output;
 }

$xml 包含 XML 格式的网页,例如:

<?xml version="1.0" encoding="utf-8"?>
<page>
 <meta>
  <language>en</language>
  <title>Main page</title>

 <content>
<![CDATA[
  lot's of content here along with <p>html</p>.
]]>
 </content>

</page>

因此,网页是 XML 格式并传递给转换函数,该函数加载一个 XSL 文件以将 XML 转换为 HTML 网页。但是,上述脚本将无法正确加载内容标记,因为 XSLT 出于某种原因不理解 CDATA,并将 HTML 编码为实体。

所以,问题是,如何使用 XSLT 将 HTML 作为 HTML 输出而不将其编码为实体?

4

2 回答 2

4

我确定您的 XSLT 中没有这样的内容:

<xsl:template match="content">
  <xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>

XSLT “理解” CDATA 非常好。更准确地说 - 它根本不关心 CDATA,这是底层 XML DOM 解析器的任务,它从中生成文本值。

从 XSLT 的角度来看,没有办法知道字符串是否

"<div>bla &amp; bla</div>"

出来的

<xml>&lt;div&gt;bla &amp;amp; bla&lt;/div&gt;</div>

或者

<xml><![CDATA[<div>bla &amp; bla</div>]]></div>

CDATA 只是一种序列化的便利。生成的信息集/DOM 是相同的。除非您禁用输出转义,否则 XSLT 会从上述字符串中正确生成以下值:

&lt;div&gt;bla &amp;amp; bla&lt;/div&gt;

这就是您在呈现的页面上看到 HTML 代码的原因。

于 2009-11-11T09:52:16.383 回答
-1

看看是否有帮助。我会在答案中添加更多内容,但我认为该链接可以更好地解释如何使用 LexEv XMLReader 从 XSLT 实现这种转换结果,这是 XSLT 和 Saxon 使用的标准 XMLReader 的包装器。

于 2009-11-11T08:40:43.560 回答