web-dev-qa-db-fra.com

Définir un doctype HTML5 avec XSLT

Comment pourrais-je proprement définir le doctype d'un fichier en HTML5 <!DOCTYPE html> via XSLT (dans ce cas avec collective.xdv )

Ce qui suit est le meilleur que mon foo Google a 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">
132
Jon Hadley

Je pense que cela n'est actuellement supporté 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>
145
Dirk Vollmar

Pour utiliser le doctype HTML simple <!DOCTYPE html>, vous devez utiliser le disable-output-escaping fonctionnalité: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Toutefois, disable-output-escaping est un fonctionnalité facultative dans XSLT, votre moteur XSLT ou votre pipeline de sérialisation peut ne pas le prendre en charge.

Pour cette raison, HTML5 fournit un autre type de document pour la compatibilité avec les versions XSLT non compatibles avec HTML5 (c’est-à-dire toutes les versions existantes de XSLT) et les autres systèmes qui rencontrent le même problème. Le doctype alternatif est <!DOCTYPE html SYSTEM "about:legacy-compat">. Pour sortir ce doctype, utilisez l'attribut doctype-system="about:legacy-compat" sur le xsl:output élément sans en utilisant un doctype-public attribut 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>
63
hsivonen
<xsl:output
     method="html"
     doctype-system="about:legacy-compat"
     encoding="UTF-8"
     indent="yes" />

cette sortie

<!DOCTYPE html SYSTEM "about:legacy-compat">

ceci est modifié en tant que correctif à http://ukchill.com/technology/generating-html5-using-xslt/

30
Jim Michaels

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>
19
stephanme

Utilisez doctype-system au lieu de doctype-public

10
Jirka Kosek

Vous devez utiliser XHTML 1.0 Strict comme type de document si vous souhaitez une sortie XHTML cohérente avec HTML5, le sérialiseur xml de libxml2 possède un mode de sortie spécial déclenché par les doctypes XHTML 1.0 garantissant 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 pas déclenche ce mode de compatibilité

Si vous êtes satisfait de la sortie html, définissez <xsl:output method="html"> devrait faire le bon choix. 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 de la plomberie à l’endroit approprié car XDV ne le supporte pas encore.

En fait, il semble que <xsl:output method="html"/> n'aide pas vraiment non plus - cela entraînera <br/> en sortie en tant que <br></br>.

8
Laurence Rowe

Cette variante de conseil de Jirka Kosek , via thématisation XDV avancée sur Plone.org semble fonctionner pour moi dans 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>
6
Jon Hadley

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

J'apprécie le fait que ce soit probablement le moyen correct, fondé sur des normes, de réaliser ce que je veux (je l'ai voté en tant que tel). Mais le premier n'est pas pris en charge (mon processeur tombe en panne) et le dernier a toujours comme résultat " 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 en panne.

Non, votre processeur XSLT n'est pas en panne, c'est simplement 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 quand vous ajoutez un deuxième <xsl:output doctype-system="about:legacy-compat"/> la précédente doctype-public n'est pas écrasé.

Notez que XHTML 1.0 strict est répertorié sous la forme = chaîne de doctype autorisée obsolète , il est donc parfaitement acceptable d'utiliser ce doctype et de l'appeler quand même HTML5.

5
Laurence Rowe

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

3
Rob

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"/>
2
Anil Kumar Gupta

Le code suivant fonctionnera comme un modèle autonome s’il est enregistré en tant que 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
Paul Sweatte

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

<?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" />
1
BananaAcid