Stellen Sie den HTML5-Doctype mit XSLT ein


134

Wie würde ich den Doctype einer Datei über XSLT sauber auf HTML5 setzen <!DOCTYPE html>(in diesem Fall mit kollektiv.xdv ) ?

Folgendes ist das Beste, was mein Google Foo finden konnte:

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

produziert:

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

7
Die Verwendung von PUBLIC "XSLT-kompatibel" ist übrigens veraltet. Der XSLT-kompatible HTML5-Doctype ist jetzt <! DOCTYPE HTML SYSTEM "about: Legacy-Compat">. Siehe dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
Ab dem letzten Editor-WD sieht es so aus, als ob fast jeder Doctype erlaubt ist: kurz <!DOCTYPE html>, alt <!DOCTYPE HTML SYSTEM "about:legacy-compat">und veraltet ("sollte nicht") HTML 4, HTML 4.01, XHTML 1.0 und XHTML 1.1 (alles strenge DTD, wenn es SYSTEM gibt).

1
Bitte aktualisieren Sie eine Antwort auf HTML5 als (heutzutage) W3C-Empfehlung.
Peter Krauss

Antworten:


147

Ich denke, dies wird derzeit nur unterstützt, indem der Doctype als Text geschrieben wird:

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

Dies erzeugt die folgende Ausgabe:

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

Dies ist der einzige Standardweg. Bei MSXSL gibt es jedoch einen nicht standardmäßigen Weg: Verwenden Sie leeres xsl: output / @ doctype-public und xsl: output / @ doctype-system.

4
disable-output-escapingwar gemeint von Casey
yegor256

Ich arbeite nicht mehr an diesem Projekt und kann es daher nicht testen. Dies wird jedoch als beste Antwort auf der Grundlage von Up-Votes markiert.
Jon Hadley

Ich benutze das die ganze Zeit. Vielen Dank.
Jgroenen

Hat

66

Um den einfachen HTML-Doctype zu verwenden <!DOCTYPE html>, müssen Sie die folgende disable-output-escapingFunktion verwenden : <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Dies disable-output-escapingist jedoch eine optionale Funktion in XSLT, sodass Ihre XSLT-Engine oder Serialisierungspipeline sie möglicherweise nicht unterstützt.

Aus diesem Grund bietet HTML5 einen alternativen Doctype für die Kompatibilität mit HTML5-unbekannten XSLT-Versionen (dh allen derzeit vorhandenen Versionen von XSLT) und anderen Systemen mit demselben Problem. Der alternative Doctype ist <!DOCTYPE html SYSTEM "about:legacy-compat">. Verwenden Sie zum Ausgeben dieses Doctype das Attribut doctype-system="about:legacy-compat"für das xsl:outputElement, ohne überhaupt ein doctype-publicAttribut zu verwenden.

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

Ich schätze, dass dies wahrscheinlich der richtige, auf Standards basierende Weg ist, um das zu erreichen, was ich will (ich habe es als solches bewertet). Ersteres wird jedoch nicht unterstützt (mein Prozessor fällt um), und letzteres führt immer noch zu "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"meinem Doctype. Wie @Jirka Kosek vorgeschlagen hat, ist mein XSLT-Prozessor möglicherweise defekt.
Jon Hadley

1
Die Mailinglistendiskussion zu Deliverance (dem von mir verwendeten XSLT-Prozessor) zu diesem Problem finden Sie hier: coactivate.org/projects/deliverance/lists/…
Jon Hadley

1
Der w3c Validator Service gibt eine Warnung aus, wenn das Dokument mit<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W


20

Mit Saxon 9.4 können Sie verwenden:

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

Dies erzeugt:

<!DOCTYPE HTML>

2
Leider ist es spezifisch für sächsisch. Auf der anderen Seite ist es einfach die präziseste Antwort auf die Frage. Ich frage mich, ob dies mit den anderen XSLT 2.0-Prozessoren funktioniert.
Paulb

Dies ist jetzt nicht mehr nur für Saxon spezifisch, sondern wird auch in den libxslt / xsltproc-Quellen unterstützt. Details hierzu finden Sie am Ende der stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/...
sideshowbarker

10

Verwenden Sie doctype-system anstelle von doctype-public


Das bleibt noch "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"im Doktyp.
Jon Hadley

5
Wenn <xsl: output doctype-system = "about: Legacy-compatible" method = "html" /> das erzeugt, was Sie sagen, liegt definitiv ein Fehler in Ihrem verwendeten XSLT-Prozessor vor.
Jirka Kosek

Wo ist dieses Verhalten angegeben? Dies funktioniert definitiv nicht in JAXP XSLT.
rustyx

xml.apache.org/xalan-j dieses gibt nicht annähernd das, was Sie erwarten - vielleicht nur Alter.
PandaWood

9

Sie müssen XHTML als Doctype 1.0 Strict verwenden , wenn Sie XHTML - Ausgabe konsistent wollen mit HTML5, XML Serializer des libxml2 hat einen speziellen Ausgabemodus durch die XHTML ausgelöst 1.0 doctypes , der sicherstellt Ausgabe ist XHTML kompatibel (zB <br />statt <br/>, <div></div>anstatt <div/>). doctype-system="about:legacy-compat"tut nicht diese Kompatibilitätsmodus auslösen

Wenn Sie mit der HTML-Ausgabe zufrieden sind, <xsl:output method="html">sollte die Einstellung das Richtige tun. Sie können dann den Doctype mit einstellen<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text> , obwohl dies an der entsprechenden Stelle installiert werden muss, da XDV dies noch nicht unterstützt.

Tatsächlich scheint <xsl:output method="html"/>es auch nicht wirklich zu helfen - dies führt dazu, <br/>dass die Ausgabe als erfolgt <br></br>.


6

Diese Variation von Jirka Koseks Ratschlägen über das Advanced XDV-Theming auf Plone.org scheint für mich in kollektiv.xdv zu funktionieren .

<?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
Ja, aber wie ich in der Antwort 0xA3 kommentiert habe, sind leere @ doctype-system oder @ doctype-public nicht standardisiert (auch, es ist gegen die Spezifikation!)

5

Dies ist ein Kommentar, aber ich habe nicht genug Karma-Punkte, um ihn an der richtigen Stelle zu platzieren. Seufzer.

Ich schätze, dass dies wahrscheinlich der richtige, auf Standards basierende Weg ist, um das zu erreichen, was ich will (ich habe es als solches bewertet). Ersteres wird jedoch nicht unterstützt (mein Prozessor fällt um) und letzteres führt in meinem Doctype immer noch zu " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ". Wie @Jirka Kosek vorgeschlagen hat, ist mein XSLT-Prozessor möglicherweise defekt.

Nein, Ihr XSLT-Prozessor ist nicht defekt. XDV fügt lediglich Folgendes hinzu:

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

Standardmäßig also, wenn Sie eine Sekunde <xsl:output doctype-system="about:legacy-compat"/>die vorherige hinzufügendoctype-public nicht überschrieben.

Beachten Sie, dass XHTML 1.0 strict als veraltete zulässige Doctype-Zeichenfolge aufgeführt ist. Es ist daher durchaus akzeptabel, diesen Doctype zu verwenden und ihn dennoch als HTML5 zu bezeichnen.


Wenn Ihr XSLT-Prozessor Elemente zu Ihren Stylesheets hinzufügt oder einige Standardwerte für Nicht-Standardattribute aufweist, bedeutet dies, dass diese fehlerhaft sind.

6
@Alejandro: XDV (jetzt umbenannt in Diazo) ist kein XSLT-Prozessor, sondern ein Thema -> XSLT-Compiler. Es ist XDV, das die Standardwerte zum kompilierten XSLT hinzufügt. Ich weiß das, weil ich es geschrieben habe;)
Laurence Rowe

3

Es tut mir leid, nur Links bereitzustellen, aber dies wurde in der WHATWG-Gruppe diskutiert, aber es ist viele Monate her, seit ich mich damit befasst habe. Hier diskutieren Ian Hickson und einige XML-Experten dies:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
und hier ist das eigentliche Problem Nummer:
http://www.w3.org/html/wg/tracker/issues/54
und hier ist diese Diskussion
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems


2

Verwenden Sie dieses Tag

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

1

Der folgende Code funktioniert als eigenständige Vorlage, wenn er als gespeichert wird 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>

Verweise


1

das ist es, was ich benutze, um einen kompatiblen HTML5-Doctype zu generieren (sächsisches HTML5 rausholen, sonst das Legacy-Ding machen)

<?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" />
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.