2009-11-11 74 views
2

我真的需要这个问题的答案。我正在研究一个使用XML创建页面的项目,然后使用XSLT将其生成为网页。下面是一个代码示例:PHP,通过XSLT将XML转换为HTML使HTML内部的CDATA编码

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输出而无需将其编码为实体?

回答

3

我敢肯定你不会有这样的事情在你的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代码的原因。

-1

看看this有帮助。我会在这里回答更多的问题,但我认为这个链接可以更好地解释如何使用LexEv XMLReader实现XSLT的这种转换结果,该XMLReader是XSLT和Saxon使用的标准XMLReader的包装。