Ustaw doctype HTML5 z XSLT


134

Jak czysto ustawiam doctype pliku na HTML5 <!DOCTYPE html>przez XSLT (w tym przypadku z collect.xdv )

Oto, co jest najlepsze, jakie mój foo z Google mógł znaleźć:

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

produkuje:

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

7
Nawiasem mówiąc, korzystanie z PUBLICZNEJ „zgodności z XSLT” jest nieaktualne. Typ dokumentu HTML5 zgodny z XSLT to teraz <! DOCTYPE HTML SYSTEM "about: legacy -atible">. Zobacz dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
Z ostatniego edytora WD wygląda na to, że prawie każdy typ dokumentu jest dozwolony: krótki <!DOCTYPE html>, starszy <!DOCTYPE HTML SYSTEM "about:legacy-compat">i przestarzały („nie powinien”) HTML 4, HTML 4.01, XHTML 1.0 i XHTML 1.1 (wszystkie ścisłe DTD, gdy istnieje SYSTEM).

1
Proszę zaktualizować odpowiedź na HTML5 jako (obecnie) zalecenie W3C.
Peter Krauss

Odpowiedzi:


147

Myślę, że jest to obecnie obsługiwane tylko przez zapisanie dokumentu jako tekstu:

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

To da następujący wynik:

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

To jedyny standardowy sposób. Ale w przypadku MSXSL istnieje inny sposób: użyj pustych xsl: output / @ doctype-public i xsl: output / @ doctype-system.

4
disable-output-escapingmiał na myśli Casey
yegor256

Nie pracuję już nad tym projektem, więc nie mogę przetestować - jednak oznaczam to jako najlepszą odpowiedź na podstawie głosów pozytywnych.
Jon Hadley

Używam tego cały czas. Dzięki.
jgroenen

Uratował mnie ... Dziękuję
cgatian

66

Aby użyć prostego HTML doctype <!DOCTYPE html>, trzeba użyć disable-output-escapingfunkcji: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Jednakże, disable-output-escapingjest to opcjonalna funkcja w XSLT, więc silnik XSLT lub rurociąg serializacji nie może go poprzeć.

Z tego powodu HTML5 zapewnia alternatywny doctype dla kompatybilności z nieświadomymi HTML5 wersjami XSLT (tj. Wszystkimi obecnie istniejącymi wersjami XSLT) i innymi systemami, które mają ten sam problem. Alternatywnym typem dokumentu jest <!DOCTYPE html SYSTEM "about:legacy-compat">. Aby wyświetlić ten typ dokumentu, użyj atrybutu doctype-system="about:legacy-compat"na xsl:outputelemencie bez używania doctype-publicatrybutu w ogóle.

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

Doceniam, że jest to prawdopodobnie poprawny, oparty na standardach sposób na osiągnięcie tego, czego chcę (głosowałem za tym). Ale ten pierwszy nie jest obsługiwany (mój procesor się przewraca), a drugi nadal skutkuje "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"moim typem dokumentu. Jak zasugerował @Jirka Kosek, myślę, że mój procesor XSLT może być uszkodzony.
Jon Hadley

1
Deliverance (procesor XSLT, którego używam) dyskusja na liście dyskusyjnej dotycząca tego problemu jest tutaj: coactivate.org/projects/deliverance/lists/ ...
Jon Hadley

1
Usługa walidatora w3c generuje ostrzeżenie, gdy dokument zaczyna się od<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W


20

Z Saxon 9.4 możesz używać:

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

To generuje:

<!DOCTYPE HTML>

2
Niestety jest to specyficzne dla Saxon. Z drugiej strony, jest to po prostu najbardziej zwięzła odpowiedź na pytanie. Zastanawiam się, czy to działa z innymi procesorami XSLT 2.0?
Paulb

Nie jest to już specyficzne tylko dla Saxona, ale jest również obsługiwane w źródłach libxslt / xsltproc. Zobacz szczegóły na końcu stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
sideshowbarker

10

Użyj doctype-system zamiast doctype-public


To wciąż pozostaje "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"w doctype.
Jon Hadley

5
jeśli <xsl: output doctype-system = "about: legacy -atible" method = "html" /> generuje to, co mówisz, oznacza to definitywny błąd w używanym przez Ciebie procesorze XSLT.
Jirka Kosek,

Gdzie jest określone to zachowanie? To zdecydowanie nie działa w JAXP XSLT.
rustyx

xml.apache.org/xalan-j ten nie daje niczego podobnego do tego, czego się spodziewasz - może tylko wieku.
PandaWood

9

Państwo musi używać XHTML 1.0 Strict jako doctype jeśli chcesz Wyjście XHTML zgodny z HTML5, libxml2 za xml serializer ma specjalny tryb wyjścia wyzwalany przez XHTML 1.0 doctypes który zapewnia produkcji jest zgodny z XHTML (np <br />zamiast <br/>, <div></div>zamiast <div/>). doctype-system="about:legacy-compat"czy nie wywoła to tryb zgodności

Jeśli jesteś zadowolony z wyjścia html, ustawienie <xsl:output method="html">powinno działać właściwie. Następnie możesz ustawić doctype za pomocą <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>, chociaż będzie to wymagało podłączenia instalacji hydraulicznej w odpowiednim miejscu, ponieważ XDV jeszcze tego nie obsługuje.

W rzeczywistości wydaje się, że to <xsl:output method="html"/>też nie pomaga - spowoduje to wyświetlenie pliku w <br/>formacie <br></br>.


6

Ta odmiana porady Jirki Kosek , za pośrednictwem motywów Advanced XDV na Plone.org, wydaje się działać dla mnie w 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
Tak, ale jak skomentowałem w odpowiedzi 0xA3, puste @ doctype-system lub @ doctype-public nie są standardowe (również niezgodne ze specyfikacją!)

5

To jest komentarz, ale nie mam wystarczającej liczby punktów karmy, aby umieścić go we właściwym miejscu. Westchnienie.

Doceniam, że jest to prawdopodobnie poprawny, oparty na standardach sposób na osiągnięcie tego, czego chcę (głosowałem za tym). Ale ten pierwszy nie jest obsługiwany (mój procesor się przewraca), a drugi nadal powoduje wyświetlenie „ http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ” w moim typie dokumentu. Jak zasugerował @Jirka Kosek, myślę, że mój procesor XSLT może być uszkodzony.

Nie, Twój procesor XSLT nie jest uszkodzony, po prostu XDV dodaje:

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

domyślnie, więc po dodaniu sekundy <xsl:output doctype-system="about:legacy-compat"/>poprzednia doctype-publicnie jest nadpisywana.

Zwróć uwagę, że XHTML 1.0 strict jest wymieniony jako przestarzały, dozwolony ciąg znaków typu doctype , więc używanie tego typu dokumentu i nadal nazywanie go HTML5 jest całkowicie dopuszczalne.


Jeśli twój procesor XSLT dodaje elementy do twoich arkuszy stylów lub ma jakieś niestandardowe wartości atrybutów, oznacza to, że jest uszkodzony.

6
@Alejandro: XDV (teraz przemianowany na diazo) nie jest procesorem XSLT, to jest motyw -> kompilator XSLT. To XDV dodaje wartości domyślne do skompilowanego XSLT. Wiem to, bo to napisałem;)
Laurence Rowe

3

Przepraszam, że podam tylko linki, ale było to omawiane w grupie WHATWG, ale minęło wiele miesięcy, odkąd się tym zajmowałem. Tutaj Ian Hickson i niektórzy eksperci XML omawiają to:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl,
a tutaj jest rzeczywisty problem numer:
http://www.w3.org/html/wg/tracker/issues/54
i tutaj jest ta dyskusja
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems


2

Użyj tego tagu

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

1

Poniższy kod będzie działał jako samodzielny szablon, jeśli zostanie zapisany jako 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>

Bibliografia


1

to jest to, czego używam do generowania kompatybilnego doctype html5 (wyciągam saksofon html5, w przeciwnym razie robię starsze rzeczy)

<?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" />
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.