Я пытаюсь создать корректный вывод 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"><!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 разрыва, так как тэг + не имеет закрывающего тега, поэтому он пытается отобразить его как два разрыва.
Если вы можете отобразить его как XHTML с правильным DOCTYPE или попробовать другой подход.
Я нашел обходное решение. Поскольку выход XHTML недоступен в XSLT 1.0, выполните следующие действия:
Сначала сохраните xsl:output
как xml
.
Во-вторых, заставить определенные теги отображать с помощью отдельного закрывающего тега, вставляя что-то посередине. Например, add  
или <xsl:comment/>
в пустых тегах, которые предполагают иметь закрывающий тег. например <div style="color: green" ><xsl:comment/></div>
или <script src="http://asdfasdf"> </script>
. Если вы конвертируете источник XHTML в XSL, то делайте аналогичную вещь, но, конечно, используйте <!---->
вместо xsl:comment
В-третьих, не удаляйте пустые комментарии и пробелы из тегов с помощью ваших XSL-шаблонов. Во всех моих таблицах стилей я включаю что-то вроде этого.
<xsl:template match="comment()|processing-instruction()"> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </xsl:template>
До сих пор это работало очень хорошо.