我正在尝试使用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处理器的替代品?
答案 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
。
其次,通过在中间插入一些东西,强制某些标签使用单独的结束标记进行渲染。例如,在假设有结束标记的空标记中添加 
或<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>
到目前为止,这对我来说非常有效。