La fonction document() permet de gérer au sein d'une même feuille plusieurs fichiers sources. Cette fonction mériterait à elle seule l'écriture d'un chapitre. Voici quelques exemples qui illustrent son efficacité.
Nous voulons faire un bilan des ventes. Chaque vente donne lieu a un rapport dans un fichier séparé. En voici un exemple : vente.
Créer tout d'abord une feuille de style permettant de visualiser chaque vente.
sortie html Nous devrons utiliser les fonctions récursives. récursivité : Aide
A partir du document maître, modifier la feuille de style précédente pour visualiser chaque vente à la suite.
sortie htm
Etudier la feuille de style pour regrouper les ventes pour chaque état. la feuille de stylesortie htm
La fonction sum calcule la somme d'un ensemble de valeurs numériques situées dans un ensemble de noeuds.
select="sum($matches[team=current()]/team/@score)"
Calculer la somme des miles volés et gagnés durant une année.
Les valeurs à sommer doivent être explicitement présentes comme noeuds du document et numériques. Nous devrons dans le cas contraire traiter l'ensemble de noeuds à l'aide d'un modèle récursif.
Sortie HTML
Présenter sous forme de tableau le résultat d'une compétition. Créer deux variables globales teams et Matches regroupant tous les éléments, les précédents de même valeur exclus. Pour chaque équipe on calculera le nombre de matchs joués, gagnés, perdus. "Allez les petits" utiliser la fonction count(aide : exclusion des précédents communs)
sortie html
Nous allons traiter un exemple utilisant les fonctions contains, substring-(afer,before). Ces fonctions classiques sont très utiles pour le changement de mots dans un texte.
Nous allons revenir sur les différentes définitions des fonctions.
test="contains($text, $replace)"
La fonction substring- divise une chaîne contenant des délimiteurs.
substring-before(le mot a trouver, 'a') renvoie le mot.substring-after(le mot a trouver, 'a') renvoie trouver.
Ainsi, la combinaison suivante : substring-before($text, ancien_mot)+nouveau_mot+substring-after($text, ancien_mot) remplacerait dans un texte l'ancien_mot par le nouveau_mot.
Nous allons tenter de remplacer toutes les occurrences du mot dans un texte.
Sortie XML
La fonction position renvoie la valeur de la position contextuelle.
<xsl:if test="position()!=last()">, </xsl:if>
La feuille de style devra mettre en forme une liste. Les éléments seront mis dans un tableau. Trois couleurs de lignes se répéteront.
La fonction last renvoie la valeur de la taille contextuelle. Last donne le nombre affecté au dernier de la liste de noeud.
La feuille de style devra mettre en forme une liste de noms.
La fonction concat permet de construire une chaîne à partir de plusieurs éléments convertis en chaîne et concaténés.
concat('Paris',' est la capitale de la ','France) = Paris est la capitale de la france
La feuille de style devra parcourir tous les éléments en utilisant la fonction concat() pour obtenir les sorties selon le format <city> name, country </city>
la fonction concat est une alternative à l'écriture de : <xsl:value-of select="name"/> <xsl:text>, </xsl:text> <xsl:value-of select="country"/>sortie xml
La fonction count compte le nombre de noeuds de l'ensemble de noeuds quelle reçoit. L'exemple suivant affecte à une variable le nombre d'attributs du noeud courant :
<xsl:variable name="nombre-attributs" select="count(@*)"/>
La feuille de style devra dénombrer les valeurs distinctes de l'attribut country de la liste d'élément <city>. La réalisation de la feuille est en deux étapes - Construction de l'ensemble de noeuds contenant tout élément <city> dont l'attribut country diffère de toute <city> précédente - Dénombrer les noeuds de cet ensemble
La première étape n'est pas simple, on utilisera le type d'écriture : select="//SPEAKER[not(.=preceding::SPEAKER)]"sortie xml
Cette fonction génère une chaîne, sous la forme d'un nom unique XML, identifiant de façon unique un noeud.
La fonction generate-id() est très souvent utilisée dans la création de liens dans un document de sortie.
<a href="#{generate-id(artist)}"> <xsl:value-of select="artist" /> </a>
<a name="{generate-id(artist)}"> <xsl:value-of select="artist" /> </a>
<xsl:for-each select="//year[not(.=preceding::year)]"><xsl:sort select="." /> <xsl:variable name="annee" select="." /> <h1> album : <xsl:value-of select="$annee"/> </h1> <xsl:for-each select="//cd[year=$annee]"> <p>Title: <xsl:value-of select="title" /> </p> </xsl:for-each></xsl:for-each>
La fonction key identifie les noeuds à partir d'une valeur donnée de la clé nommée. Elle permet d'effectuer des accès associatifs (par le contenu) à des noeuds. Elle est utilisée de pair avec <xsl:key>.
<xsl:key name="livre-auteur" match="livre" use="auteur"/><xsl:for-each select="key('livre-auteur','dupont');/>
Lorsque nous disposons de deux documents sources, la valeur d'un élément peut servir de référence croisée vers le deuxième fichier (comme une jointure en SQL). Déclarer une clé identifiant les éléments <author> d'après les attributs de nom. Le fichier source secondaire est référencé par une variable globale.
Une autre utilisation des clés permet de regrouper des noeuds apparentés. On définit une clé sur la valeur commune déterminant l'appartenance au groupe. Par exemple, si chaque année des CDs composent un groupe, la définition de la clé sera :
<xsl:key name="annee-gr" match="cd" use="year" />
La boucle externe sélectionne un cd pour chaque année. Pour cela on sélectionne tous les CDs que l'on filtre en ne sélectionnant que les premiers de chaque année. On peut dire qu'un cd est le premier de l'année en le comparant au premier nœud de l'ensemble de nœuds renvoyé par la fonction key() appliquée à cette année.
<xsl:for-each select="//cd[generate-id()=generate-id(key (' annee-gr',year)[1])]">
On utilise ici le prédicat generate-id() afin de vérifier que l'année est le même nœud que celui renvoyé par la fonction key().
<xsl:key name="annee-gr" match="cd" use="year" /> <xsl:template match="/"><html><body><xsl:for-each select="//cd[generate-id()= generate-id(key('annee-gr',year)[1])]"> <h1> album : <xsl:value-of select="year" /> </h1> <xsl:for-each select="key('annee-groupe',year)"> <p>Title: <xsl:value-of select="title" /> </xsl:for-each></xsl:for-each></body></html></xsl:template>