1

我正在尝试使用 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 处理器的替代方案?

4

2 回答 2

1

HTML 没有自闭合标签。主要是因为 HTML 不是 XML。

<br></br>被解释为 2 个中断,因为一个<br>标签没有结束标签,这就是它尝试将其呈现为两个中断的原因。

如果您可以使用正确的 DOCTYPE将其呈现为XHTML ,或者尝试另一种方法。

于 2013-11-01T00:59:39.010 回答
0

我找到了解决方法。由于 XHTML 输出在 XSLT 1.0 中不可用,请执行以下操作:

首先,保持xsl:outputxml.

其次,通过在中间插入一些东西来强制某些标签使用单独的结束标签呈现。例如,在假设有结束标签的空标签中添加&#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>

到目前为止,这对我来说效果很好。

于 2013-11-06T19:05:04.737 回答