我正在尝试使用 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"><!DOCTYPE html> </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 处理器的替代方案?
HTML没有自闭合标签。主要是因为HTML不是XML。
<br></br>
被解释为 2 个中断,因为 <br>
标记没有结束标记,这就是它尝试将其呈现为两个中断的原因。
如果您可以使用正确的 DOCTYPE 将其呈现为 XHTML,或者尝试其他方法。
我找到了解决方法。由于 XHTML 输出在 XSLT 1.0 中不可用,请执行以下操作:
首先,保持xsl:output
xml
。
其次,通过在中间插入一些内容来强制某些标签使用单独的结束标签进行渲染。例如,在假定具有结束标记的空标记中添加 
或<xsl:comment/>
。就像这样<div style="color: green" ><xsl:comment/></div>
或<script src="http://asdfasdf"> </script>
.如果你在XSL中转换XHTML源代码,那么做类似的事情,但当然使用<!---->
而不是xsl:comment
第三,请确保不要使用 XSL 模板从标记中删除空注释和空格。在我所有的样式表中,我都包含这样的东西。
<xsl:template match="comment()|processing-instruction()">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
到目前为止,这对我来说效果很好。