Установить тип документа HTML5 с помощью XSLT

Как бы я корректно установил doctype файла в HTML5 <!DOCTYPE html> через XSLT (в этом случае с collect.xdv)

Следующее, что лучше всего, мой Google foo смог найти:

<xsl:output
    method="html"
    doctype-public="XSLT-compat"
    omit-xml-declaration="yes"
    encoding="UTF-8"
    indent="yes" />

дает:

<!DOCTYPE html PUBLIC "XSLT-compat" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Ответ 1

Я думаю, что в настоящее время это поддерживается только путем написания doctype в виде текста:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="utf-8" indent="yes" />

  <xsl:template match="/">
    <xsl:text disable-output-escaping='yes'>&lt;!DOCTYPE html&gt;</xsl:text>
    <html>
    </html>
  </xsl:template>

</xsl:stylesheet>

Это приведет к следующему выводу:

<!DOCTYPE html>
<html>
</html>

Ответ 2

Чтобы использовать простой HTML doctype <!DOCTYPE html>, вы должны использовать функцию disable-output-escaping: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Однако disable-output-escaping является необязательной функцией в XSLT, поэтому ваш механизм XSLT или конвейер сериализации может не поддерживать его.

По этой причине HTML5 предоставляет альтернативный doctype для совместимости с версиями XSLT, не поддерживающими HTML5 (т.е. все существующие версии XSLT) и другими системами, которые имеют одинаковую проблему. Альтернативный doctype - <!DOCTYPE html SYSTEM "about:legacy-compat">. Чтобы вывести этот тип doctype, используйте атрибут doctype-system="about:legacy-compat" в элементе xsl:output без использования атрибута doctype-public вообще.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="html" doctype-system="about:legacy-compat"/>
   ...
   <html>
   </html>
</xsl:stylesheet>

Ответ 3

<xsl:output
     method="html"
     doctype-system="about:legacy-compat"
     encoding="UTF-8"
     indent="yes" />

это выводит

<!DOCTYPE html SYSTEM "about:legacy-compat">

это изменено как мое исправление для http://ukchill.com/technology/generating-html5-using-xslt/

Ответ 4

С Saxon 9.4 вы можете использовать:

<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />

Это генерирует:

<!DOCTYPE HTML>

Ответ 5

Используйте doctype-system вместо doctype-public

Ответ 6

Вы должны использовать XHTML 1.0. Строго как doctype, если вы хотите, чтобы XHTML-выход соответствовал HTML5, сериализатор libxml2 xml имеет специальный режим вывода, инициированный доктринами XHTML 1.0, который обеспечивает выход XHTML-совместимым ( например <br />, а не <br/>, <div></div>, а не <div/>). doctype-system="about:legacy-compat" делает не запуск этого режима совместимости

Если вы довольны выходом html, то настройка <xsl:output method="html"> должна быть правильной. Затем вы можете установить doctype с помощью <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>, хотя это потребует сантехники в соответствующем месте, поскольку XDV еще не поддерживает это.

На самом деле кажется, что <xsl:output method="html"/> тоже не помогает - это приведет к выводу <br/> как <br></br>.

Ответ 8

Это комментарий, но у меня недостаточно очков кармы, чтобы поместить его в нужное место. Вздох.

Я ценю, что это, вероятно, правильный, стандартизированный способ выполнения того, что я хочу (я его поддержал как таковой). Но первый не поддерживается (мой процессор падает), а последний по-прежнему приводит к " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" в моем doctype. Как предположил @Jirka Kosek, я думаю, что мой XSLT-процессор может быть сломан.

Нет, ваш XSLT-процессор не сломан, просто XDV добавляет:

<xsl:output method="xml" indent="no" omit-xml-declaration="yes" media-type="text/html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

по умолчанию, поэтому, когда вы добавляете второй <xsl:output doctype-system="about:legacy-compat"/>, предыдущий doctype-public не перезаписывается.

Обратите внимание, что XHTML 1.0 strict указан как устаревшая разрешенная строка doctype, поэтому вполне приемлемо использовать этот тип doctype и по-прежнему называть его HTML5,

Ответ 9

Извините за предоставление ссылок, но это обсуждалось среди группы WHATWG, но прошло много месяцев с тех пор, как я справился с этим. Здесь Ян Хиксон и некоторые эксперты XML обсуждают это:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
и вот номер фактической проблемы:
http://www.w3.org/html/wg/tracker/issues/54
и здесь это обсуждение
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems

Ответ 10

Следующий код будет работать как отдельный шаблон, если он сохранен как html5.xml:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="html5.xml"?>
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
            >
<xsl:output method="xml" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="no" doctype-system="about:legacy-compat" />

<xsl:template match="xsl:stylesheet">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="/">
  <html>
    <head>
      <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    </head>
    <body>
      <xsl:text>hi</xsl:text>
    </body>
  </html>
</xsl:template>

</xsl:stylesheet>

Ссылки

Ответ 11

что я использую для создания совместимого html5 doctype (получение saxons html5 out, в противном случае выполнение устаревшей вещи)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/TR/REC-html40">

    <xsl:output
        method="html"
        version="5.0"
        doctype-system="about:legacy-compat"
        encoding="UTF-8"
        indent="yes" />

Ответ 12

Использовать этот тег

<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="XSLT-compat" indent="yes"/>