带有PHP XSL转换器的HTML 5

时间:2013-10-04 20:31:36

标签: php xml html5 xslt xslt-1.0

我正在尝试使用PHP中的XSL转换器生成有效的HTML 5输出,我很难这样做。以下是PHP代码示例:

<?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 />处于自动关闭状态,只会被解释为开头<div>,文字为绿色。

我需要你的建议如何继续。 PHP XSL处理器中是否有一些未记录的选项,只能使某些标签自动关闭。是否有内置XSLT处理器的替代品?

2 个答案:

答案 0 :(得分:1)

HTML does not have self-closing tags.主要是因为HTML不是XML。

<br></br>被解释为2次中断,因为<br>标记没有结束标记,这就是为什么它会尝试将其渲染为两次中断。

如果您可以将其渲染为XHTML with the correct DOCTYPE,或尝试其他方法。

答案 1 :(得分:0)

我找到了解决方法。由于XSLT输出在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>

到目前为止,这对我来说非常有效。