JeuWeb - Crée ton jeu par navigateur
[XSL] Chapitre 3 - Variables XSL et fonctions d'agrégation - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [XSL] Chapitre 3 - Variables XSL et fonctions d'agrégation (/showthread.php?tid=1897)



[XSL] Chapitre 3 - Variables XSL et fonctions d'agrégation - Roworll - 18-10-2007

Troisième chapître sur XSL et ses possibilités.
Accrochez vous, ça commence à devenir sportif.
Je vous recommande de lire au préalable le contenu des deux premiers tutoriaux si vous n'avez pas une bonne expérience sur XSL.

Les Variables

Une variable en XSL se déclare grace au tag <xsl:variable name="" select=""/>
L'attribut name contient le nom de la variable
L'attribut select contient sa valeur
Les variables s'utilisent en préfixant leur nom par un $.

Petit exemple
Code PHP :
<?php 
<xsl:variable name="varxsl" select="'contenu de ma variable XSL'"/>
Le contenu de ma variable nommée varxsl est <xsl:value-of select="$varxsl"/>
Les variables XSL sont différentes des variables PHP sur bien des points
  • Elles ne sont pas dynamiques.
  • Elles ont une portée limitée au noeud dans lequel elles sont déclarées
  • Elles peuvent contenir des valeurs fixes ou une partie de l'arborescence d'un document XML

Elles ne sont pas dynamiques.
Il est impossible en effet de changer à la volée le contenu d'une variable. On doit la redéfinir si on veut changer sa valeur. <xsl:variable name="incremental" select="$incremental + 1"/>, ne fonctionnera pas.

De la même manière, on ne peut pas déclarer deux fois la même variable dans un même bloc.
Code PHP :
<?php 
<xsl:variable name="varxsl" select="'première déclaration'"/>
<
xsl:variable name="varxsl" select="'deuxième déclaration déclaration'"/>
va générer une erreur.

Elles ont une portée limitée au noeud dans lequel elles sont déclarées
Une variable est visible dans le noeud qui l'a déclaré et dans tous les noeuds enfants.
Code PHP :
<?php 
<div>
<!--
La variable créee ci dessous ne sera visible que dans le DIV en cours et les éléménts enfants.-->
<
xsl:variable name="myvar" select="'variable XSL'"/>
<!--
Ici, ma variable est valide-->
<
xsl:value-of select="$myvar"/>
<
span>
<!--
Ici, ma variable est toujours valide-->
<
xsl:value-of select="$myvar"/>
</
span>
</
div>
<!--
Ici, ma variable n'est plus connue-->
<!--Cet appel générera une erreur car il est fait en dehors du DIV ou a été créé la variable-->
<xsl:value-of select="$myvar"/>

Elles peuvent contenir des valeurs fixes ou une partie de l'arborescence d'un document XML
C'est ici que les variables montrent leur puissance.
Dans l'attribut select, il est possible de spécifier une expression XPath de manière à stocker le résultat pour une utilisation ultérieure.
Prenons par exemple le XML suivant
Code PHP :
<?php 
<page>
<
unitetype>
<
type id="1" att="10" def="3">Cavalerie</type>
<
type id="2" att="5" def="0">Archer</type>
<
type id="3" att="2" def="2">Fantassin</type>
</
unitetype>
<
uniteequip>
<
eqp id="1" def="1">Armure de Cuir</eqp>
<
eqp id="2" def="2">Cotte de Mailles</eqp>
<
eqp id="3" def="3">Armure de Plates</eqp>
<
eqp id="4" att="3">Epée Longue</eqp>
<
eqp id="5" att="2">Epée Courte</eqp>
<
eqp id="6" att="2">Hache</eqp>
<
eqp id="7" att="3">Lance</eqp>
<
eqp id="8" att="1">Fourche</eqp>
<
eqp id="9" att="3">Arbalète</eqp>
<
eqp id="10" att="1">Arc Court</eqp>
<
eqp id="11" att="2">Arc Long</eqp>
<
eqp id="12" def="1">Bouclier</eqp>
</
uniteequip>
</
page>
Je vais créer une variable XSL contenant la liste des équipements possibles et l'utiliser pour afficher des informations
Code PHP :
<?php 
<!--je récupère dans une variable tous les éléménts de type eqp-->
<
xsl:variable name="equiplist" select="/page/uniteequip/eqp" />
<!--
Affiche le contenu de l élément correspondant à ID=8 en utilisant la variable-->
<
xsl:value-of select="$equiplist[@id='8']"/>
<!--
Même chose à partir du fichier XML-->
<
xsl:value-of select="/page/uniteequip/eqp[@id='8']"/>
<!--
Créé une variable statique-->
<
xsl:variable name="staticid" select="'10'" />
<!--
Affiche le contenu de l élément correspondant à ID=10 en utilisant les variables-->
<
xsl:value-of select="$equiplist[@id=$staticid]"/>

Les fonctions d'aggrégation
Ce sont les fonctions de type sum(), count(), etc. XSL peut faire ce genre d'opérations sur les fichiers XML.
Ces fonctions prennent en paramètre une expression XPath
<xsl:value-of select="count(//eqp)" /> va renvoyer le nombre de noeuds ayant "eqp" pour nom
<xsl:variable name="max_att" select="max(//unite/@att)" /> va renvoyer la valeur maximum de l'attribut "att" existant pour les noeuds "unite" et mettre le tout dans la variable $max_att

Voici un fichier le XSL qui sert d'exemple pour illustrer ces explications sur les variables et les fonctions d'aggrégation.
Il y a une utilisation intensive des variables, des fonctions d'aggrégation
Code PHP :
<?xml version="1.0" encoding="UTF-8" ?>
<!--<? /*ceci est juste un faux tag PHP (<?) pour permettre la colorisation du code*/ -->
<
xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<
xsl:template match="/">

<
html>
<
head>
<
style>
html {font-family:verdana, helvetica, sans-serif; font-size:11px;}
th {text-align:left;}
div.unit {position:relative; float:left;border:solid black 1px;margin:5px;}
div.header {border-bottom:solid black 1px;padding:2px;}
div.body {position:relative;padding:2px; padding-right:40px;}
div.att {font-weight:bold; position:absolute; right:3px;
top:3px; border:solid black 1px;
width:30px;height:30px;
text-align:center; vertical-align:baseline;}
div.def {font-weight:bold; position:absolute; right:3px;
bottom:3px; border:solid black 1px;
width:30px;height:30px;
text-align:center; vertical-align:center;}
table.detail {border:solid black 1px;}
tr.values {font-weight:bold;}
tr.equip {background-color:lightgrey;}
tr.head {font-weight:bold; background-color:lightgrey;}
tr.head th {border-bottom:solid black 1px;}
td.values {text-align:center; border-left:solid black 1px;}
</
style>
</
head>
<
body>
<
xsl:variable name="equiplist" select="/page/uniteequip/eqp"/>
<
xsl:variable name="typelist" select="/page/unitetype/type"/>


<
xsl:for-each select="/page/unites/unite">
<
xsl:variable name="unit" select="."/>
<
xsl:variable name="eqpunit" select="$unit//equipement/@id"/>

<
div class="unit">
<
div class="header">
Type : <xsl:value-of select="$typelist[@id=$unit/@type]"/><br />
Unité : <xsl:value-of select="@nom"/><br />
Quantité : <xsl:value-of select="@total"/><br />
</
div>
<
div class="body">
<
table class="detail" cellspacing="0" cellpadding="2">
<
tr class="head">
<
th>Détail</th>
<
th>Att</th>
<
th>Déf</th>
</
tr>
<
tr class="values">
<
td>Valeur de Base</td>
<
td class="values"><xsl:value-of select="$typelist[@id=$unit/@type]/@att"/></td>
<
td class="values"><xsl:value-of select="$typelist[@id=$unit/@type]/@def"/></td>
</
tr>
<
xsl:for-each select="./equipement">
<
tr class="equip">
<
xsl:variable name="equipid" select="@id"/>
<
td>- <xsl:value-of select="$equiplist[@id=$equipid]/."/></td>
<
td class="values"><xsl:value-of select="$equiplist[@id=$equipid]/@att"/></td>
<
td class="values"><xsl:value-of select="$equiplist[@id=$equipid]/@def"/></td>
</
tr>
</
xsl:for-each>
<
tr class="values">
<
td>Total</td>
<
td class="values">
<
xsl:value-of select="sum($equiplist[@id=$eqpunit]/@att) + $typelist[@id=$unit/@type]/@att"/>
</
td>
<
td class="values">
<
xsl:value-of select="sum($equiplist[@id=$eqpunit]/@def) + $typelist[@id=$unit/@type]/@def"/>
</
td>
</
tr>
</
table>
<
div class="att">
ATT<br />
<
xsl:value-of select="(sum($equiplist[@id=$eqpunit]/@att) + $typelist[@id=$unit/@type]/@att) * @total"/>
</
div>
<
div class="def">
DEF<br />
<
xsl:value-of select="(sum($equiplist[@id=$eqpunit]/@def) + $typelist[@id=$unit/@type]/@def) * @total"/>
</
div>
</
div>
</
div>
</
xsl:for-each>

</
body>
</
html>

</
xsl:template>
</
xsl:stylesheet>



Fichiers utilisés pour ce tutorial
Fichier XML
Fichier XSL
Résultat


RE: XSL : Chap 3 - Variables XSL et fonctions d'aggrégation - Plume - 05-11-2007

L'aide pour ce tutoriel ce trouve à cette adresse :
http://www.jeuweb.org/board/showthread.php?tid=2751