Установить тип документа 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'><!DOCTYPE html></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"><!DOCTYPE html></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"><!DOCTYPE html></xsl:text>
, хотя это потребует сантехники в соответствующем месте, поскольку XDV еще не поддерживает это.
На самом деле кажется, что <xsl:output method="html"/>
тоже не помогает - это приведет к выводу <br/>
как <br></br>
.
Ответ 7
Этот вариант советник Jirka Kosek, через Расширенные темы XDV в Plone.org, похоже, работает для меня в collect.xdv.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
doctype-public="HTML"
doctype-system=""/>
</xsl:stylesheet>
Ответ 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"/>