【问题标题】:PHP, XML to HTML through XSLT makes HTML inside CDATA encodedPHP, XML to HTML through XSLT 使 CDATA 中的 HTML 编码
【发布时间】:2009-11-11 08:32:02
【问题描述】:

我真的需要这个问题的答案。我正在开发一个项目,该项目使用 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 而不将其编码为实体?

【问题讨论】:

    标签: php html xml xslt cdata


    【解决方案1】:

    我确定你的 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 代码的原因。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-03-03
        • 2010-11-26
        • 1970-01-01
        • 2015-08-24
        • 2010-12-11
        • 1970-01-01
        • 2013-12-13
        • 2017-10-04
        • 2015-06-05
        相关资源
        最近更新 更多