2013-10-04 52 views
1

我想在PHP中使用XSL轉換器生成有效的HTML 5輸出,我很難這樣做。下面是示例PHP代碼:HTML 5與PHP XSL變壓器

<?php 
$xml_source = '<?xml version="1.0" encoding="utf-8"?><content/>'; 
$xsl_source = <<<EOD 
<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" encoding="utf-8" /> 
    <xsl:template match="content"> 
     <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;&#10;</xsl:text> 
     <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
      <body> 
      <div style="color: green"></div> 
      This text should be black 
      <br/> 
      This black text is on next line 
      </body>      
     </html> 
    </xsl:template> 
    <xsl:template match="/"> 
     <xsl:apply-templates /> 
    </xsl:template> 
</xsl:stylesheet> 
EOD; 

$xml = new DomDocument; 
$xml->LoadXML($xml_source); 

$xsl = new DomDocument; 
$xsl->loadXML($xsl_source); 

$xslt = new XSLTProcessor; 
$xslt->importStyleSheet($xsl); 
echo $xslt->transformToXML($xml); 

<xsl:output method="html"它產生

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
    <body> 
     <div style="color: green"></div> 
     This text should be black 
     <br></br> 
     This black text is on next line 
    </body> 
</html> 

<br></br>被解釋成兩個休息

<xsl:output method="xml"它產生

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
    <body> 
     <div style="color: green" /> 
     This text should be black 
     <br /> 
     This black text is on next line 
    </body> 
</html> 

<div />是SEL f關閉,這被解釋爲只是一個開放<div>和文本是綠色的。

我需要你的建議如何繼續。在PHP XSL處理器中是否有一些未公開的選項使得只有一些標籤自動關閉。是否有內置XSLT處理器的替代方案?

+0

可能的解決方法是將輸出保留爲'xml',並在假標記爲結束標籤的空標記中添加' '或''。像這樣'

' –

回答

0

我找到了解決方法。由於XHTML輸出在XSLT 1.0中不可用,請執行以下操作:

首先,將xsl:output保存爲xml

其次,通過在中間插入一些東西,強制某些標籤通過單獨的閉合標籤進行渲染。例如,在假設有結束標記的空標記中添加&#160;<xsl:comment/>。像這樣<div style="color: green" ><xsl:comment/></div><script src="http://asdfasdf">&#160;</script>。如果您在XSL轉換XHTML源然後做類似的事情,但當然使用的<!---->代替xsl:comment

第三,確保不刪除標記空的意見和空間與您的XSL模板。在我所有的樣式表中,我都包含這樣的內容。

<xsl:template match="comment()|processing-instruction()"> 
     <xsl:copy> 
     <xsl:apply-templates /> 
     </xsl:copy> 
    </xsl:template> 

到目前爲止,這對我來說效果很好。