Установить тип документа HTML5 с помощью XSLT - PullRequest
130 голосов
/ 02 августа 2010

Как бы я чисто установил тип документа для файла HTML5 <!DOCTYPE html> через XSLT (в данном случае с colle.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">

Ответы [ 12 ]

143 голосов
/ 02 августа 2010

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

<?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>
61 голосов
/ 04 августа 2010

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

По этой причине HTML5 предоставляет альтернативный тип документа для совместимости с версиями XSLT, не знакомыми с HTML5 (то есть со всеми существующими версиями XSLT), и другими системами, имеющими ту же проблему. Альтернативный тип документа - <!DOCTYPE html SYSTEM "about:legacy-compat">. Чтобы вывести этот тип документа, используйте атрибут 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>
30 голосов
/ 06 мая 2012
<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/

19 голосов
/ 15 октября 2013

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

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

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

<!DOCTYPE HTML>
10 голосов
/ 02 августа 2010

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

8 голосов
/ 04 августа 2010

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

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

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

6 голосов
/ 02 августа 2010

Этот вариант совета Джирки Косек , через Расширенные темы XDV на Plone.org , кажется, работает для меня в коллективный. *.

<?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>
5 голосов
/ 04 августа 2010

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

Я ценю, что это, вероятно, правильный, основанный на стандартах способ достичь того, чего я хочу (я проголосовал за него как таковой). Но первое не поддерживается (мой процессор падает), а второе по-прежнему приводит к «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 указан как устаревшая разрешенная строка типа документа , поэтому вполне допустимо использовать этот тип документа и по-прежнему называть его HTML5.

3 голосов
/ 02 августа 2010

Извините, что предоставил только ссылки, но это обсуждалось в группе 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

2 голосов
/ 12 февраля 2018

Используйте этот тег

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