INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10...

37
Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 1 XSLT Exemples pas-à-pas (2) INU3011 EBSI

Transcript of INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10...

Page 1: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 1

XSLT

Exemples pas-à-pas (2)

INU3011 – EBSI

Page 2: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

La DTD (pour référence)

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 2

<!ELEMENT notice (accès, lisibilité, auteurs, titre)>

<!ATTLIST notice type (article | rapport) #REQUIRED>

<!ELEMENT accès (restreint | général)>

<!ELEMENT restreint EMPTY>

<!ELEMENT général EMPTY>

<!ELEMENT lisibilité (restreint | général)>

<!ELEMENT auteurs (auteur+)>

<!ELEMENT auteur (#PCDATA)>

<!ELEMENT titre (#PCDATA)>

Page 3: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 3

Traitement typique

d'éléments répétables<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<xsl:apply-templates select="notice/auteurs" />

</body>

</html>

</xsl:template>

<xsl:template match="auteurs">

<p><strong>Auteurs:</strong></p>

<ul><xsl:apply-templates /></ul>

</xsl:template>

<xsl:template match="auteur">

<li><xsl:value-of select="." /></li>

</xsl:template>

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

Page 4: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 4

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<p><strong>Auteurs:</strong></p>

<ul>

<li>Julia Royer</li>

<li>Claude Rouleau</li>

</ul>

</body>

</html>

Page 5: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 5

Résultat en navigateur

Page 6: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 6

Attributs dans l'extrant HTML

• Pour mettre un attribut dont la valeur ne

varie pas d'un document à l'autre:

– Facile: on met la valeur d'attribut dans un

fragment HTML

– Exemple:

<a href="http://www.ebsi.umontreal.ca/">EBSI</a>

Page 7: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 7

Attribut dont la valeur ne varie pas

d'un document à l'autre

<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<h1><xsl:value-of select="notice/titre" /></h1>

<hr/>

<p>Cette notice est disponible à

l'<a href="http://ebsi.umontreal.ca/">EBSI</a>.

</p>

</body>

</html>

</xsl:template>

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

Page 8: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 8

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<h1>Le printemps</h1>

<hr>

<p>Cette notice est disponible à

l'<a href="http://ebsi.umontreal.ca/">EBSI</a>.

</p>

</body>

</html>

Page 9: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 9

Résultat en navigateur

Page 10: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 10

Attribut dont la valeur varie

d'un document à l'autre<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<h1><xsl:value-of select="notice/titre" /></h1>

<hr/>

<p>Le type de ce document est

<xsl:value-of select="notice/@type" />.

Cliquez ici pour une

<a href="desc-{notice/@type}.html">description

de ce type de document</a>.</p>

</body>

</html>

</xsl:template>

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

Page 11: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 11

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<h1>Le printemps</h1>

<hr>

<p>Le type de ce document est

article.

Cliquez ici pour une

<a href="desc-article.html">description de ce

type de document</a>.

</p>

</body>

</html>

Page 12: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 12

Résultat en navigateur

Page 13: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 13

Avec un document d'un autre type

<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<h1><xsl:value-of select="notice/titre" /></h1>

<hr/>

<p>Le type de ce document est

<xsl:value-of select="notice/@type" />.

Cliquez ici pour une

<a href="desc-{notice/@type}.html">description

de ce type de document</a>.</p>

</body>

</html>

</xsl:template>

<notice type="rapport">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

Page 14: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 14

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<h1>Le printemps</h1>

<hr>

<p>Le type de ce document est

rapport.

Cliquez ici pour une

<a href="desc-rapport.html">description de ce

type de document</a>.

</p>

</body>

</html>

Page 15: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 15

Résultat en navigateur

Page 16: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 16

Gabarits de valeur d'attribut

• La forme {…} dans une valeur d'attribut

d'un fragment HTML s'appelle un gabarit

de valeur d'attribut

• Il doit contenir une expression XPath

• Le résultat de l'expression remplace le

gabarit dans la valeur d'attribut réellement

placée dans l'extrant

• Déjà vu dans l'exemple 170-Ex-multimedia

– Feuille XSLT livre.xsl

Page 17: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 17

Autre façon d'ajouter dans l'extrant

un attribut dont la valeur varie

d'un document à l'autre

• L'exemple 245-Ex-XSLT-attribut illustre

une autre façon de procéder, sans gabarit

de valeur d'attribut

Page 18: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Traitement spécial des premiers

de fratrie

• Souvent, par exemple dans des listes ou

autres sortes d’énumération, les premiers

de fratrie doivent être traités différemment:

– Ex.: Jean, Paul, Louis

– Le délimiteur « , » ne doit pas être inséré

avant le premier nom !

– Doit aussi marcher s'il y a un seul élément

dans la fratrie

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 18

Page 19: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 19

Traitement spécial du

premier auteur

<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<xsl:apply-templates select="notice/auteurs" />

</body>

</html>

</xsl:template>

<xsl:template match="auteurs">

<p><strong>Auteurs: </strong>

<xsl:apply-templates select="*" />.</p>

</xsl:template>

<xsl:template match="auteur">,

<xsl:value-of select="." /></xsl:template>

<xsl:template match="auteur[1]">

<xsl:value-of select="." /></xsl:template>

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

<auteur>Elvis Tekakwitha</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

Page 20: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 20

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<p><strong>Auteurs: </strong>Julia Royer,

Claude Rouleau,

Elvis Tekakwitha.

</p>

</body>

</html>

N.B.: Ça marche même s'il n'y a qu'un auteur !

Page 21: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 21

Résultat en navigateur

Page 22: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 22

Traitements conditionnels

• Instructions xsl:if et xsl:choose

– Permettent d'ajuster le traitement en fonction

d'une condition sur le contenu du document

– Peut parfois permettre de diminuer la

redondance entre plusieurs gabarits:

• Un gabarit général remplace plusieurs spécialisés

– Exemples avec nos notices:

• ajout d'un "s" seulement si plus d'un auteur…

• simplifier le traitement de l'accès…

Page 23: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 23

Traitement des auteursOn revient un peu en arrière…<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<xsl:apply-templates select="notice/auteurs" />

</body>

</html>

</xsl:template>

<xsl:template match="auteurs">

<p><strong>Auteurs:</strong></p>

<ul><xsl:apply-templates /></ul>

</xsl:template>

<xsl:template match="auteur">

<li><xsl:value-of select="." /></li>

</xsl:template>

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Elvis Tekakwitha</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

Page 24: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 24

Résultat en navigateur

Pas très joli linguistiquement…

Peut-on faire mieux que "Auteur(s)" ?

Page 25: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 25

Oui, avec xsl:if

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Elvis Tekakwitha</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<xsl:apply-templates select="notice/auteurs" />

</body>

</html>

</xsl:template>

<xsl:template match="auteurs">

<p><strong>Auteur<xsl:if

test="count(*)>1">s</xsl:if>:</strong></p>

<ul><xsl:apply-templates /></ul>

</xsl:template>

<xsl:template match="auteur">

<li><xsl:value-of select="." /></li>

</xsl:template>

Page 26: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 26

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<p><strong>Auteur:</strong></p>

<ul>

<li>Elvis Tekakwitha</li>

</ul>

</body>

</html>

Page 27: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Maintenant, en navigateur…

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 27

Page 28: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 28

Et ça marche encore

avec plus d'unauteur…

<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<xsl:apply-templates select="notice/auteurs" />

</body>

</html>

</xsl:template>

<xsl:template match="auteurs">

<p><strong>Auteur<xsl:if

test="count(*)>1">s</xsl:if>:</strong></p>

<ul><xsl:apply-templates /></ul>

</xsl:template>

<xsl:template match="auteur">

<li><xsl:value-of select="." /></li>

</xsl:template>

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

<auteur>Elvis Tekakwitha</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

Page 29: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 29

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<p><strong>Auteurs:</strong></p>

<ul>

<li>Julia Royer</li>

<li>Claude Rouleau</li>

<li>Elvis Tekakwitha</li>

</ul>

</body>

</html>

Page 30: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

… comme on peut voir !

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 30

Page 31: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 31

Traitement de l'accèsPoint de départ (rappel)

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<xsl:apply-templates select="notice/accès" />

</body>

</html>

</xsl:template>

<xsl:template match="accès[général]">

<p>L'accès à cette notice n'est pas limité.</p>

</xsl:template>

<xsl:template match="accès[restreint]">

<p>L'accès à cette notice est limité.</p>

</xsl:template>

Page 32: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 32

Avec xsl:choose

<notice type="article">

<accès><général/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<xsl:apply-templates select="notice/accès" />

</body>

</html>

</xsl:template>

<xsl:template match="accès">

<p>L'accès à cette notice

<xsl:choose>

<xsl:when test="restreint">est</xsl:when>

<xsl:otherwise>n'est pas</xsl:otherwise>

</xsl:choose>

limité.</p>

</xsl:template>

Page 33: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 33

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<p>L'accès à cette notice

n'est pas

limité.

</p>

</body>

</html>

Page 34: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 34

Même résultat en navigateur

qu'avec les gabarits originels…

Page 35: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 35

... aussi avec accès restreint…

<notice type="article">

<accès><restreint/></accès>

<lisibilité><restreint/></lisibilité>

<auteurs>

<auteur>Julia Royer</auteur>

<auteur>Claude Rouleau</auteur>

</auteurs>

<titre>Le printemps</titre>

</notice>

<xsl:template match="/">

<html>

<head>

<title><xsl:value-of select="notice/titre" /></title>

</head>

<body>

<xsl:apply-templates select="notice/accès" />

</body>

</html>

</xsl:template>

<xsl:template match="accès">

<p>L'accès à cette notice

<xsl:choose>

<xsl:when test="restreint">est</xsl:when>

<xsl:otherwise>n'est pas</xsl:otherwise>

limité.</p>

</xsl:template>

Page 36: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 36

Extrant de la transformation XSLT

<html>

<head>

<title>Le printemps</title>

</head>

<body>

<p>L'accès à cette notice

est

limité.

</p>

</body>

</html>

Page 37: INU3011 Documents structurésCopyright © 2010-2020 Yves Marcoux - Reproduction interdite 10 Attribut dont la valeur varie d'un document à l'autre

… comme on peut voir !

Copyright © 2010-2020 Yves Marcoux - Reproduction interdite 37

On a remplacé deux gabarits par un seul, éliminant

par le fait même la redondance qu'il y avait entre les deux