HTML 5 с трансформатором PHP XSL

Я пытаюсь создать корректный вывод HTML 5 с использованием XSL-трансформатора в PHP, и у меня возникают трудности с этим. Вот пример кода 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;
</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 разрыва, так как тэг + не имеет закрывающего тега, поэтому он пытается отобразить его как два разрыва.

    Если вы можете отобразить его как XHTML с правильным DOCTYPE или попробовать другой подход.

    Я нашел обходное решение. Поскольку выход XHTML недоступен в XSLT 1.0, выполните следующие действия:

    Сначала сохраните xsl:output как xml .

    Во-вторых, заставить определенные теги отображать с помощью отдельного закрывающего тега, вставляя что-то посередине. Например, add &#160; или <xsl:comment/> в пустых тегах, которые предполагают иметь закрывающий тег. например <div style="color: green" ><xsl:comment/></div> или <script src="http://asdfasdf">&#160;</script> . Если вы конвертируете источник XHTML в XSL, то делайте аналогичную вещь, но, конечно, используйте <!----> вместо xsl:comment

    В-третьих, не удаляйте пустые комментарии и пробелы из тегов с помощью ваших XSL-шаблонов. Во всех моих таблицах стилей я включаю что-то вроде этого.

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

    До сих пор это работало очень хорошо.