【问题标题】:HTML 5 with PHP XSL transformer带有 PHP XSL 转换器的 HTML 5
【发布时间】:2013-10-11 23:38:03
【问题描述】:

我正在尝试使用 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 );

&lt;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>

&lt;br&gt;&lt;/br&gt; 被解释为两个中断

&lt;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>

&lt;div /&gt; 是自动关闭的,它被解释为只是打开 &lt;div&gt; 并且文本是绿色的。

我需要您对如何进行的建议。 PHP XSL 处理器中是否有一些未记录的选项可以仅使某些标签自动关闭。是否有内置 XSLT 处理器的替代方案?

【问题讨论】:

  • 解决此问题的一种可能方法是将输出保持为“xml”,并在假设有结束标签的空标签中添加&amp;#160;&lt;xsl:comment/&gt;。像这样&lt;div style="color: green" &gt;&lt;xsl:comment/&gt;&lt;/div&gt;

标签: php xml html xslt xslt-1.0


【解决方案1】:

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

&lt;br&gt;&lt;/br&gt; 被解释为 2 个中断,因为 &lt;br&gt; 标记没有结束标记,这就是它尝试将其呈现为两个中断的原因。

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

【讨论】:

  • 是的。这几乎就是问题所在。
【解决方案2】:

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

首先,将xsl:output 保留为xml

其次,通过在中间插入一些东西来强制某些标签使用单独的结束标签呈现。例如,在假设有结束标签的空标签中添加&amp;#160;&lt;xsl:comment/&gt;。就像&lt;div style="color: green" &gt;&lt;xsl:comment/&gt;&lt;/div&gt;&lt;script src="http://asdfasdf"&gt;&amp;#160;&lt;/script&gt;。如果你在 XSL 中转换 XHTML 源代码,那么做类似的事情,但当然使用 &lt;!----&gt; 而不是 xsl:comment

第三,确保不要使用 XSL 模板从标签中删除空的 cmets 和空格。在我所有的样式表中,我都包含这样的内容。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2012-05-24
    • 2014-09-10
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多