Poster une réponse  Créer un sujet 
[XSL] Chapitre 3 - Variables XSL et fonctions d'agrégation
Auteur Message
Roworll
Membre


Messages : 721
Groupe : Membre
Inscription : Dec 2006
Statut : Hors ligne
Réputation : 14
Message : #1
[XSL] Chapitre 3 - Variables XSL et fonctions d'agrégation

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 :
<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 :
<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 :
<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'"/>
    <!--
Icima variable est valide-->
    <
xsl:value-of select="$myvar"/>
    <
span>
        <!--
Icima variable est toujours valide-->
        <
xsl:value-of select="$myvar"/>
    </
span>
</
div>
<!--
Icima variable nest 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 :
<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 :
<!--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:verdanahelveticasans-serif;    font-size:11px;}
        
th {text-align:left;}
        
div.unit {position:relativefloat:left;border:solid black 1px;margin:5px;}
        
div.header {border-bottom:solid black 1px;padding:2px;}
        
div.body {position:relative;padding:2pxpadding-right:40px;}
        
div.att {font-weight:boldposition:absoluteright:3px;
            
top:3pxborder:solid black 1px;
             
width:30px;height:30px;
            
text-align:centervertical-align:baseline;}
        
div.def {font-weight:boldposition:absoluteright:3px
            
bottom:3pxborder:solid black 1px
            
width:30px;height:30px
            
text-align:centervertical-align:center;}
        
table.detail {border:solid black 1px;}
        
tr.values {font-weight:bold;}
        
tr.equip {background-color:lightgrey;}
        
tr.head {font-weight:boldbackground-color:lightgrey;}
        
tr.head th {border-bottom:solid black 1px;}
        
td.values {text-align:centerborder-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


"La vanité est mon pêché préféré."
John Milton, L'associé du diable

Ce message a été modifié le: 09-09-2008 11:22 AM par Sephi-Chan.

10-18-2007 12:15 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
LexLxUs
Membre


Messages : 2,490
Groupe : Membre
Inscription : Aug 2006
Statut : Hors ligne
Réputation : 0
Message : #2
RE: XSL : Chap 3 - Variables XSL et fonctions d'aggrégation

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

11-05-2007 09:27 PM
Trouver tous les messages de cet utilisateur Citer ce message dans une réponse
Poster une réponse  Créer un sujet 

Voir une version imprimable
Envoyer ce sujet à un ami
S'abonner au sujet | Ajouter le sujet aux favoris