Встановіть HTML5-тип за допомогою XSLT


134

Як я чітко встановив тип документа для HTML5 <!DOCTYPE html>через XSLT (у цьому випадку з колекцією.xdv )

Наступне, що найкраще вдалося знайти в моєму Google:

<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">

7
До речі, використання PUBLIC "XSLT-compat" застаріло. XSLT, сумісний з HTML5, тепер <! DOCTYPE HTML SYSTEM "about: legacy-compat">. Дивіться dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
З останнього редактора WD, схоже, майже будь-який тип дозволеного файлу: короткий <!DOCTYPE html>, застарілий <!DOCTYPE HTML SYSTEM "about:legacy-compat">і застарілий ("не слід") HTML 4, HTML 4.01, XHTML 1.0 та XHTML 1.1 (усі суворі DTD, коли є СИСТЕМА).

1
Будь ласка, оновіть відповідь на HTML5 як (сьогодні) рекомендація W3C.
Пітер Краус

Відповіді:


147

Я думаю, що це в даний час підтримується лише написанням вчення в тексті:

<?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>

Це єдиний стандартний спосіб. Але для MSXSL існує нестандартний спосіб: використовувати порожні xsl: output / @ doctype-public та xsl: output / @ doctype-system.

4
disable-output-escapingмав на увазі Кейсі
yegor256

Я більше не працюю над цим проектом, тому не можу перевірити, однак, відзначивши це найкращою відповіддю на основі голосуючих голосів.
Джон Хадлі

Цим я користуюся постійно. Дякую.
jgroenen

Врятували мене ... Дякую
cgatian

66

Для того, щоб використовувати простий 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>

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

1
Звернення (процессор XSLT, яким я користуюся) обговорення списку розсилки щодо цієї проблеми знаходиться тут: coactivate.org/projects/deliverance/lists/…
Jon Hadley

1
Служба валідатора w3c видає попередження, коли документ починається з<!DOCTYPE html SYSTEM "about:legacy-compat">
Адріан В

30
<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/


1
Служба валідатора w3c видає попередження, коли документ починається з<!DOCTYPE html SYSTEM "about:legacy-compat">
Адріан В

20

З Saxon 9.4 ви можете використовувати:

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

Це породжує:

<!DOCTYPE HTML>

2
На жаль, це характерно для Саксонії. З іншого боку, це просто найбільш стисла відповідь на питання Q. Цікаво, чи працює це з іншими процесорами XSLT 2.0?
Полб

Тепер це вже не характерно лише для Saxon, але також підтримується у джерелах libxslt / xsltproc. Деталі див. У кінці stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
sideshowbarker

10

Використовуйте doctype-систему замість doctype-public


Це все ще залишається "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"у вченні.
Джон Хедлі

5
якщо <xsl: output doctype-system = "about: legacy-compat" method = "html" /> виробляє те, що ви говорите, то остаточно помилка у вашому використовуваному процесорі XSLT.
Jirka Kosek

Де вказана така поведінка? Це, безумовно, не працює в JAXP XSLT.
rustyx

xml.apache.org/xalan-j цей не дає ніде того, що ви очікуєте - можливо, лише вік.
PandaWood

9

Ви повинні використовувати XHTML 1.0 Strict як doctype, якщо ви хочете, щоб вихід XHTML відповідав HTML5, серіалізатор xml libxml2 має спеціальний режим виведення, що ініціюється доктіпами 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>.


6

Ця зміна рекомендацій Jirka Kosek в , з допомогою Advanced XDV тематизації на Plone.org , здається, працює для мене в collective.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>

1
Так, але, як я коментував у відповіді 0xA3, порожня @ doctype-система або @ doctype-public не є стандартними (також це проти специфікації!)

5

Це коментар, але мені не вистачає карма-балів, щоб поставити його в потрібне місце. Зітхнути.

Я розумію, що це, мабуть, правильний, орієнтований на стандарти спосіб досягнення того, що я хочу (я підтримував це як таке). Але перший не підтримується (мій процесор перепадає), а другий все ще призводить до " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " в моєму документі. Як запропонував @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 строгий вказаний як застарілий дозволений рядок doctype , тому цілком прийнятним є використання цього типу і все ще називати його HTML5.


Якщо ваш процесор XSLT додає елементи до ваших таблиць стилів або має якісь нестандартні значення атрибуту за замовчуванням, це означає, що він порушений.

6
@Alejandro: XDV (тепер перейменований на diazo) не є процесором XSLT, це тема -> компілятор XSLT. Саме XDV додає значення за замовчуванням до складеного XSLT. Я це знаю, тому що я це написав;)
Лоранс Роу

3

Вибачте, що надаю лише посилання, але це обговорювалося серед групи 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/isissue/54
і ось ця дискусія
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems


2

Використовуйте цей тег

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

1

Наступний код буде працювати як окремий шаблон, якщо його збережено як 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>

Список літератури


1

ось що я використовую для створення сумісного дотипу html5 (виведення саксів html5, інакше робити застарілу річ)

<?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" />
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.