Définir le doctype HTML5 avec XSLT


134

Comment définir proprement le doctype d'un fichier sur HTML5 <!DOCTYPE html>via XSLT (dans ce cas avec collectif.xdv )

Ce qui suit, qui est le meilleur que mon Google foo ait pu trouver:

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

produit:

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

7
Incidemment, l'utilisation de PUBLIC "XSLT-compat" est obsolète. Le doctype HTML5 compatible XSLT est désormais <! DOCTYPE HTML SYSTEM "about: legacy-compat">. Voir dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci

1
Depuis le dernier éditeur WD, il semble que presque tous les doctype sont autorisés: court <!DOCTYPE html>, hérité <!DOCTYPE HTML SYSTEM "about:legacy-compat">et obsolète ("ne devrait pas") HTML 4, HTML 4.01, XHTML 1.0 et XHTML 1.1 (tous DTD strict quand il y a SYSTEM).

1
Veuillez mettre à jour une réponse à HTML5 comme recommandation (de nos jours) du W3C.
Peter Krauss

Réponses:


147

Je pense que cela n'est actuellement pris en charge qu'en écrivant le doctype sous forme de texte:

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

Cela produira la sortie suivante:

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

C'est le seul moyen standard. Mais, avec MSXSL, il existe un moyen non standard: utilisez xsl: output / @ doctype-public et xsl: output / @ doctype-system vide.

4
disable-output-escapingétait signifié par Casey
yegor256

Je ne travaille plus sur ce projet, donc incapable de tester - cependant, marquant cela comme la meilleure réponse basée sur des votes positifs.
Jon Hadley

Je l'utilise tout le temps. Merci.
jgroenen

Saved me ... Thank you
cgatian

66

Pour utiliser le HTML simple doctype <!DOCTYPE html>, vous devez utiliser la disable-output-escapingfonction: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Cependant, il disable-output-escapings'agit d'une fonctionnalité facultative dans XSLT, de sorte que votre moteur XSLT ou votre pipeline de sérialisation peut ne pas la prendre en charge.

Pour cette raison, HTML5 fournit un doctype alternatif pour la compatibilité avec les versions XSLT non compatibles HTML5 (c'est-à-dire toutes les versions actuellement existantes de XSLT) et d'autres systèmes qui ont le même problème. Le doctype alternatif est <!DOCTYPE html SYSTEM "about:legacy-compat">. Pour afficher ce doctype, utilisez l'attribut doctype-system="about:legacy-compat"sur l' xsl:outputélément sans utiliser d' doctype-publicattribut du tout.

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

J'apprécie que c'est probablement le moyen correct, basé sur les normes, d'accomplir ce que je veux (je l'ai voté comme tel). Mais le premier n'est pas pris en charge (mon processeur tombe) et le second aboutit toujours "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"à mon doctype. Comme @Jirka Kosek l'a suggéré, je pense que mon processeur XSLT est peut-être cassé.
Jon Hadley

1
La discussion de la liste de diffusion Deliverance (le processeur XSLT que j'utilise) concernant ce problème est ici: coactivate.org/projects/deliverance/lists/…
Jon Hadley

1
Le service de validation du w3c émet un avertissement lorsque le document commence par<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W


20

Avec Saxon 9.4, vous pouvez utiliser:

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

Cela génère:

<!DOCTYPE HTML>

2
Malheureusement, c'est spécifique à Saxon. D'autre part, c'est simplement la réponse la plus concise au Q. Je me demande si cela fonctionne avec les autres processeurs XSLT 2.0?
Paulb

Ceci n'est plus spécifique à Saxon mais est également pris en charge dans les sources libxslt / xsltproc. Voir les détails à la fin de stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
côtéshowbarker

10

Utilisez doctype-system au lieu de doctype-public


Cela laisse encore "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"dans le doctype.
Jon Hadley

5
si <xsl: output doctype-system = "about: legacy-compat" method = "html" /> produit ce que vous dites, alors il y a définitivement un bogue dans votre processeur XSLT que vous utilisez.
Jirka Kosek

Où ce comportement est-il spécifié? Cela ne fonctionne certainement pas dans JAXP XSLT.
rustyx

xml.apache.org/xalan-j celui-ci ne donne rien de ce que vous attendez - peut-être juste l'âge.
PandaWood

9

Vous devez utiliser XHTML 1.0 Strict comme doctype si vous voulez une sortie XHTML cohérente avec HTML5, le sérialiseur xml de libxml2 a un mode de sortie spécial déclenché par les doctypes XHTML 1.0 qui garantit que la sortie est compatible XHTML, (par exemple <br />plutôt que <br/>, <div></div>plutôt que <div/>). doctype-system="about:legacy-compat"ne déclenche pas ce mode de compatibilité

Si vous êtes satisfait de la sortie html, alors le réglage <xsl:output method="html">devrait faire la bonne chose. Vous pouvez ensuite définir le doctype avec <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>, bien que cela nécessite une plomberie à l'endroit approprié car XDV ne le prend pas encore en charge.

En fait, cela <xsl:output method="html"/>ne semble pas vraiment aider non plus - cela entraînera <br/>une sortie sous forme de fichier <br></br>.


6

Cette variante des conseils de Jirka Kosek , via le thème Advanced XDV sur Plone.org semble fonctionner pour moi dans collectif.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
Oui, mais comme je l'ai commenté dans la réponse 0xA3, les @ doctype-system ou @ doctype-public vides ne sont pas standard (aussi, c'est contre les spécifications!)

5

C'est un commentaire, mais je n'ai pas assez de points de karma pour le mettre au bon endroit. Soupir.

J'apprécie que c'est probablement le moyen correct, basé sur les normes, d'accomplir ce que je veux (je l'ai voté comme tel). Mais le premier n'est pas supporté (mon processeur tombe) et le second aboutit toujours à " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " dans mon doctype. Comme @Jirka Kosek l'a suggéré, je pense que mon processeur XSLT est peut-être cassé.

Non, votre processeur XSLT n'est pas cassé, c'est juste que XDV ajoute:

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

par défaut, donc lorsque vous ajoutez une seconde <xsl:output doctype-system="about:legacy-compat"/>le précédentdoctype-public n'est pas écrasé.

Notez que XHTML 1.0 strict est répertorié comme une chaîne doctype autorisée obsolète , il est donc parfaitement acceptable d'utiliser ce doctype et de l'appeler toujours HTML5.


Si votre processeur XSLT ajoute des éléments à vos feuilles de style ou a des valeurs par défaut d'attribut non standard, cela signifie qu'il est cassé.

6
@Alejandro: XDV (maintenant renommé diazo) n'est pas un processeur XSLT, c'est un thème -> compilateur XSLT. C'est XDV qui ajoute les valeurs par défaut dans le XSLT compilé. Je le sais parce que je l'ai écrit;)
Laurence Rowe

3

Désolé de ne fournir que des liens, mais cela a été discuté au sein du groupe WHATWG, mais cela fait plusieurs mois que je ne l'ai pas traité. Ici, Ian Hickson et quelques experts XML discutent de ceci:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
et voici le problème réel numéro:
http://www.w3.org/html/wg/tracker/issues/54
et voici cette discussion
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems


2

Utilisez cette balise

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

1

Le code suivant fonctionnera comme un modèle autonome s'il est enregistré sous 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>

Références


1

c'est ce que j'utilise pour générer un doctype html5 compatible (sortir les saxons html5, sinon faire le truc hérité)

<?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" />
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.