1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2016
    Messages : 2
    Points : 1
    Points
    1

    Par défaut La moyenne des points sans "Count()" avec XSLT

    BONJOUR,

    Quelqu'un peut m'aider s'il vous plait?

    J'ai un fichier xsl qui calcule le nombre de points par semaine de mon fichier xml, je dois faire en sorte que mon fichier affiche en plus deux lignes

    l’une contenant la moyenne des totaux hebdomadaires de points (donc la moyenne de {7, 30, 4}).
    l’autre contenant la moyenne des points journaliers (donc la moyenne de {1, 3, 2, 1, 2, 8, 20, 1, 3}).

    mais cette fois sans la fonction count().

    Voici mon fichier XML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" encoding="utf-8"?>
    <points>
      <semaine>
        <jour>1</jour>
        <jour>3</jour>
        <jour>2</jour>
        <jour>1</jour>
      </semaine>
      <semaine>
        <jour>2</jour>
        <jour>8</jour>
        <jour>20</jour>
      </semaine>
      <semaine>
        <jour>1</jour>
        <jour>3</jour>
      </semaine>
    </points>
    et ma feuille de style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
      <xsl:output method="text"/>
     
      <xsl:template match="/">
        <xsl:apply-templates select="*/*"/>
    	<xsl:call-template name="moyenne"/>
      </xsl:template>
     
      <xsl:template match="*">
        <xsl:text>Il y a </xsl:text>
        <xsl:call-template name="comptage">
          <xsl:with-param name="total">0</xsl:with-param>
          <xsl:with-param name="index_courant">1</xsl:with-param>
        </xsl:call-template>
        <xsl:text> points cette semaine.&#xa;</xsl:text> 
      </xsl:template>
     
      <xsl:template name="comptage">
        <xsl:param name="total"/> 
        <xsl:param name="index_courant"/> 
        <xsl:choose> 
          <xsl:when test="$index_courant = count(*) + 1"> 
            <xsl:value-of select="$total"/>
          </xsl:when> 
          <xsl:otherwise> 
    	  <xsl:variable name="un_nombre"><xsl:value-of select="*[position() = $index_courant]"/></xsl:variable>
    	  <xsl:call-template name="comptage"> 
              <xsl:with-param name="total">
    		<xsl:value-of select="$total + $un_nombre"/>
    	  </xsl:with-param> 
              <xsl:with-param name="index_courant"><xsl:value-of select="$index_courant + 1"/></xsl:with-param> 
            </xsl:call-template> 
          </xsl:otherwise>
        </xsl:choose>
     
      </xsl:template>
     
      <xsl:template name="moyenne">
    	<xsl:variable name="sem"><xsl:value-of select="sum(points/semaine/*)"/></xsl:variable>
    	<xsl:variable name="jour"><xsl:value-of select="sum(points/semaine/jour)"/></xsl:variable>
    	<!-- nbrSem= nombre de semaines et nbrJour= nombre de jours -->
    	<xsl:variable name="nbrSem"><xsl:value-of select="count(points/semaine)"/></xsl:variable>
    	<xsl:variable name="nbrJour"><xsl:value-of select="count(points/semaine/jour)"/></xsl:variable>
    	<xsl:text>la moyenne des totaux hebdomadaires de points: </xsl:text> <xsl:value-of select="$sem div $nbrSem"/>
    	<xsl:text>&#xa;la moyenne des points journaliers est : </xsl:text><xsl:value-of select="$jour div $nbrJour"/><xsl:text>&#xa;</xsl:text>
      </xsl:template>
     
    </xsl:stylesheet>
    j'execute avec le terminal: xsltproc fichier.xsl fichier.xml
    je ne sais plus quoi faire


    Merci d'avance!

  2. #2
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 085
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 085
    Points : 1 880
    Points
    1 880

    Par défaut

    D'abord, je n'ai compris bien saisi la raison qui vous concerne contre l'emploi de la fonction count(). Si c'est pour la raison de ne pas savoir comment compter pas globalement (//jour) mais pour jour dedans chaque semaine - on peut faire, d'ailleurs, comme ça via //semaine[1]/jour, //semaine[2]/jour, etc, mais ce n'est pas très pratique et moins génerique - ce n'est pas une raison valable. Voici comment faire.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="yes" />
    <xsl:decimal-format name="fr" decimal-separator="," grouping-separator="." />
     
    <xsl:template match="/">
        <resultat>
            <grande-moyenne>
                <xsl:value-of select="format-number(sum(//jour) div count(//jour), '#,00', 'fr')" />
            </grande-moyenne>
            <xsl:apply-templates select="points/semaine" />
        </resultat>
    </xsl:template>
     
    <xsl:template match="semaine">
        <semaine>
            <xsl:attribute name="ord"><xsl:value-of select="position()" /></xsl:attribute>
            <moyenne-chaque-semaine>
                <xsl:value-of select="format-number(sum(jour) div count(jour), '#,00', 'fr')" />
            </moyenne-chaque-semaine>
        </semaine>
    </xsl:template>
    On peut l'écrire pour faire sortie par méthode="text" avec les messages comme vous entendez faire. La réécriture est facile avec toutes les éléments numériques sont là déjà.

    Parfois, il y a une vraie nécessité de passer par un template nommé et de faire récursivement pour gagner la contrôle bien nécessaire, mais pas ici, je ne pense pas.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2016
    Messages : 2
    Points : 1
    Points
    1

    Par défaut

    Merci, mais le but etait de le faire sans la fonction Count().

  4. #4
    Membre chevronné
    Inscrit en
    octobre 2011
    Messages
    1 085
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 085
    Points : 1 880
    Points
    1 880

    Par défaut

    Oui, si on veut, c'est peut-on dire très éducatif aussi.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <xsl:template match="semaine">
        <semaine>
            <point-total>
                <xsl:call-template name="comptage">
                    <xsl:with-param name="node" select="jour" />
                    <xsl:with-param name="total">0</xsl:with-param>
                </xsl:call-template>
            </point-total>
        </semaine>
    </xsl:template>
     
    <xsl:template name="comptage">
        <xsl:param name="node" />
        <xsl:param name="total">0</xsl:param>
        <xsl:choose>
            <xsl:when test="$node">
                <xsl:call-template name="comptage">
                    <xsl:with-param name="node" select="$node/following-sibling::*[name()=name($node)]" />
                    <xsl:with-param name="total" select="$total+number($node)" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$total" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo