[BONUS] DOCTYPE HTML5 avec XSLT
Génération du DOCTYPE HTML5 avec XSLT
[Exercice BONUS]
Le but de cet exercice est de comprendre les différentes manières de générer le DOCTYPE HTML5 avec XSLT.
Rappel : le DOCTYPE valide en HTML5 est le suivant :
On dispose des fichiers xml et xsl suivants :
movies.xml
<movies>
<movie>
<title>Aliens</title>
<year>1986</year>
<rank>8.2</rank>
</movie>
<movie>
<title>Apollo 13</title>
<year>1995</year>
<rank>7.5</rank>
</movie>
<movie>
<title>Pi</title>
<year>1998</year>
<rank>7.1</rank>
</movie>
</movies>
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="movies.xsl"?> <movies> <movie> <title>Aliens</title> <year>1986</year> <rank>8.2</rank> </movie> <movie> <title>Apollo 13</title> <year>1995</year> <rank>7.5</rank> </movie> <movie> <title>Pi</title> <year>1998</year> <rank>7.1</rank> </movie> </movies>
movies.xsl
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="html"
doctype-public="-//W3C//DTD HTML 4.01//EN"
doctype-system="http://www.w3.org/TR/html4/strict.dtd"
encoding="utf-8"
indent="yes" />
<xsl:template match="/">
<html lang="en">
<head>
<title>List of Movies.</title>
<link rel="stylesheet" href="movies.css" />
</head>
<body>
<table class="movies">
<thead>
<tr>
<th>Title</th>
<th>Year</th>
<th>Rank</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="movies/movie">
<xsl:sort select="rank"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="year"/></td>
<td><xsl:value-of select="rank"/></td>
</tr>
</xsl:for-each>
</tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
<?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" doctype-public="-//W3C//DTD HTML 4.01//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd" encoding="utf-8" indent="yes" /> <xsl:template match="/"> <html lang="en"> <head> <title>List of Movies.</title> <link rel="stylesheet" href="movies.css" /> </head> <body> <table class="movies"> <thead> <tr> <th>Title</th> <th>Year</th> <th>Rank</th> </tr> </thead> <tbody> <xsl:for-each select="movies/movie"> <xsl:sort select="rank"/> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="year"/></td> <td><xsl:value-of select="rank"/></td> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template> </xsl:stylesheet>
Exemples repris et adaptés depuis : https://efxa.org/2013/06/03/how-to-transform-an-xml-document-into-html5-using-xslt/
Ouvrir ces fichiers dans Oxygen. Tester la génération du fichier HTML4 en sortie.
On remarque que les attributs doctype-public et doctype-system permettent de générer le DOCTYPE HTML4 voulu.
Question
L'instruction XSLT 1.0 <xsl:text disable-output-escaping='yes'></xsl:text>
permet de générer du texte en sortie.
L'attribut disable-output-escaping='yes' permet de reconvertir les caractères HTML échappés en sortie (&
en "&" par exemple).
Rappel : les chevrons "<" et ">" correspondent respectivement aux codes suivants, <
et >
.
Le statut de DOE (disable-output-escaping) et la "DOCTYPE legacy string"
La solution ci-dessus utilise la fonctionnalité DOE (disable-output-escaping), mais celle-ci :
n'est qu'une fonctionnalité optionnelle d'un moteur XSLT 1.0 ;
est dépréciée en XSLT 2.0.
Les spécifications de HTML5 fournissent une alternative à l'aide de la "DOCTYPE legacy string" : <!DOCTYPE html SYSTEM "about:legacy-compat">
.
Question
[BONUS] L'instruction <xsl:character-map>
La solution précédente ne doit être utilisé que si le moteur XSLT n'est pas capable de générer le DOCTYPE HTML5 standard (en version courte).
Source : spécification HTML5 du W3C.
Nous allons nous intéresser à une solution utilisant une instruction valide en XSLT 2.0, <xsl:character-map>
.
On placera cette instruction avant l'instruction <xsl:output>
.
La syntaxe de l'instruction :
<xsl:character-map name="name">
<xsl:output-character character="x" string="remplacement de x"/>
</xsl:character-map>
<xsl:character-map name="name"> <xsl:output-character character="x" string="remplacement de x"/> </xsl:character-map>
L'instruction <xsl:output-character>
utilisée à l'intérieur de <xsl:character-map>
prend un unique character et le remplace en sortie par la chaîne string spécifiée.
On utilisera l'attribut use-character-maps="charactermapname"
dans l'instruction <xsl:output>
pour activer les substitutions lors de la transformation xsl.