Я пытаюсь преобразовать документ .html, используя xslt. Сгенерированный html по какой-то причине имеет дополнительный атрибут xmlns в элементе head и пустой атрибут xmlns в элементе title.
example.html:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>foo</title></head>
<body><h1>bar</h1><img src="baz.jpg" /></body>
</html>
template.xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output doctype-system="about:legacy-compat" method="html"
omit-xml-declaration="yes" />
<xsl:template match="/html/head">
<head>
<meta name="description" content="something added to the head element"/>
<xsl:apply-templates select="./@*|./node()" />
</head>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Я тестировал преобразование с помощью xsltproc и php.
Запуск xsltproc:
$ xsltproc -html template.xsl example.html
<!DOCTYPE html SYSTEM "about:legacy-compat">
<html xmlns="http://www.w3.org/1999/xhtml">
<head xmlns="http://www.w3.org/1999/xhtml"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="description" content="something added to the head element"></meta><title xmlns="">foo</title></head><body>
<h1>bar</h1>
<img src="baz.jpg">
</body>
</html>
Использование PHP:
<?php
$xmldoc = new DomDocument ();
$xmldoc->loadHTMLFile ("example.html");
$xsldoc = new DomDocument ();
$xsldoc->load ("template.xsl");
$xslt = new XSLTProcessor();
$xslt->importStylesheet($xsldoc);
echo $xslt->transformToXML ($xmldoc);
Я ожидаю, что все элементы в исходном документе будут находиться в пространстве имен html, поэтому я не понимаю, почему apply-templates, по-видимому, удаляет пространство имен из элемента title. Я также не понимаю, почему пространство имен html добавляется к элементу head.