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">
Jon Hadley
la source
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>
Dirk Vollmar
la source
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>
hsivonen
la source
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>
stephanme
la source
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

Jirka Kosek
la source
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>.

Laurence Rowe
la source
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>
Jon Hadley
la source
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.

Laurence Rowe
la source
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

Rob
la source
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"/>
Anil Kumar Gupta
la source
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

Paul Sweatte
la source
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" />
BananeAcide
la source