IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

[XSLT] requête pour recuperer un max


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [XSLT] requête pour recuperer un max
    salut tout le monde
    cvp je cherche a réaliser une requête sur ce fichier XML

    la requête :je cherche le mécanicien ayant effectué le plus d'heures de travail du 10/07/2007 au 12/07/2007, bornes comprises.
    le fichier XML et la DTD est comme suite

    le fichier :garage.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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    <?xml version="1.0" encoding="iso-8859-1"?>
    <?DOCTYPE garage SYSTEM "garage2.dtd"?>
    <?xml-stylesheet href="r1.xsl" type="text/xsl"?> 
     
    <garage>
     
    <vehicule  immatriculation="1234 CX 80" nom="Dupont" marque="Peugeot" type="406"/>
    <vehicule  immatriculation="5678 DY 80" nom="Durand" marque="Dupont" type="Carpatia"/>
    <vehicule  immatriculation="9012 EZ 80" nom="Duchemini" marque=" Alpha Roméo " type="ZP"/>
     
    <proprietaire nom="Dupont" prenom="Georges"/>
    <proprietaire nom="Durand" prenom="Joseph"/>
    <proprietaire nom="Duchemini" prenom="Alfredo"/>
     
     
     
    <reparation numo="123" immatriculation="1234 CX 80" date_entree="10/07/2007" date_sortie="11/07/2007" />
    <reparation numo="124" immatriculation="5678 DY 80" date_entree="12/07/2007"/>
    <reparation numo="125" immatriculation="9012 EZ 80" date_entree="11/07/2007" date_sortie="12/07/2007" />
     
    <mecanicien numeca="12" nom="Terieur" prenom="Alain"/>
    <mecanicien numeca="13" nom="Terieur" prenom="Alex"/>
    <mecanicien numeca="14" nom="Brindavoine" prenom="Wilfrid"/>
    <mecanicien numeca="15" nom="Chauvaux" prenom="Bernard"/>
    <mecanicien numeca="16" nom="Veaufroid" prenom="jules"/>
     
     
    <mec_rep numo="123" numeca="12" nbh="2"/>
    <mec_rep numo="123" numeca="13" nbh="3.5"/>
    <mec_rep numo="124" numeca="12" nbh="4"/>
    <mec_rep numo="124" numeca="14" nbh="6"/>
    <mec_rep numo="125" numeca="13" nbh="1"/>
    <mec_rep numo="125" numeca="15" nbh="2.5"/>
    <mec_rep numo="125" numeca="16" nbh="1"/>
     
     
    </garage>

    le fichier garage2.dtd

    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
     
     
    <!ELEMENT garage (vehicule+, proprietaire+, reparatio+, mecanicien+, mec_rep+)>
    <!ELEMENT vehicule EMPTY>
    <!ATTLIST vehicule immatriculation ID #REQUIRED>
    <!ATTLIST vehicule nom IDREF #REQUIRED>
    <!ATTLIST vehicule  marque CDATA #REQUIRED>
    <!ATTLIST vehicule  type CDATA #REQUIRED>
     
    <!ELEMENT proprietaire EMPTY>
    <!ATTLIST proprietaire nom ID #REQUIRED>
    <!ATTLIST proprietaire prenom CDATA #REQUIRED>
     
    <!ELEMENT reparation EMPTY>
    <!ATTLIST reparation numo ID #REQUIRED>
    <!ATTLIST reparation immatriculation IDREF #REQUIRED>
    <!ATTLIST reparation date_entree CDATA #REQUIRED>
    <!ATTLIST reparation date_sortie CDATA #IMPLIED >
     
    <!ELEMENT mecanicien  EMPTY>
    <!ATTLIST mecanicien numeca ID #REQUIRED>
    <!ATTLIST mecanicien nom ID #REQUIRED>
    <!ATTLIST mecanicien prenom CDATA #REQUIRED>
     
    <!ELEMENT mec_rep  EMPTY>
    <!ATTLIST mec_rep numeca IDREF #REQUIRED>
    <!ATTLIST mec_rep numo IDREF #REQUIRED>
    <!ATTLIST mec_rep nbh CDATA #REQUIRED>

  2. #2
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    on pourrait imaginer faire une variable contenant pour chaque mecano le nombre d'heure fait.
    Puis de trier cette liste par heure effectué et de prendre la position =1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <xs:variable name="listmc">
      <list>
      <xsl:for-each select="//mecanicien/@numeca">
        <mec>
        <xs:variable name="id" value="."/>
        <xsl:attribute name="numeca"><xsl:value-of select="$id"/>
        <xsl:value-of select="sum(//mec_rep[@numeca=$id]/@nbh)">
        </mec>
      </xsl:for-each>
      </list>
    </xsl:variable>
    il ne reste plus qu'a trier ta variable listmc

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par fraoustin Voir le message
    on pourrait imaginer faire une variable contenant pour chaque mecano le nombre d'heure fait.
    Puis de trier cette liste par heure effectué et de prendre la position =1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <xs:variable name="listmc">
      <list>
      <xsl:for-each select="//mecanicien/@numeca">
        <mec>
        <xs:variable name="id" value="."/>
        <xsl:attribute name="numeca"><xsl:value-of select="$id"/>
        <xsl:value-of select="sum(//mec_rep[@numeca=$id]/@nbh)">
        </mec>
      </xsl:for-each>
      </list>
    </xsl:variable>
    il ne reste plus qu'a trier ta variable listmc
    salut merci pour votre aide
    j'ai tester ce code mais j'ai eu des erreurs
    et je croit que j'ai pas bien compri

  4. #4
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     
    	<xsl:template match="/">
      		<xsl:variable name="listmc">
      			<list>
      				<xsl:for-each select="//mecanicien/@numeca">
        					<mec>
          						<xsl:variable name="id" select="."/>
          						<xsl:attribute name="numeca"><xsl:value-of select="$id"/></xsl:attribute>
          						<xsl:value-of select="sum(//mec_rep[@numeca=$id]/@nbh)"/>
        					</mec>
      				</xsl:for-each>
      			</list>
    		</xsl:variable>
    		<result>
    			<xsl:for-each select="$listmc//mec">
    				<xsl:sort/>
    				<xsl:if test="position()=last()">
    					<xsl:value-of select="@id"/>
     
    					<xsl:value-of select="."/>
    				</xsl:if>
    			</xsl:for-each>
    		</result>
    	</xsl:template>
     
     
    </xsl:stylesheet>
    a priori j'ai des soucis avec le for-each mais je pense que l'idée est bonne

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    un ami ma envoyer ce code mais il y a un problème

    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
     
     
    <?xml version="1.0" encoding="iso-8859-1"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     
       <xsl:output method="xml" encoding="iso-8859-1" /> 
     
       <xsl:template match="/"> 
          <xsl:variable name="meca_nbh"> 
             <xsl:for-each select="//mecanicien"> 
                <xsl:sort select="@numeca" data-type="number" order="ascending" /> 
     
                <!-- Keep only the first occurence of each user_id --> 
                <xsl:if test="generate-id(.) = generate-id(//mecanicien[@numeca=current()/@numeca][position() = 1])"> 
                   <xsl:element name="mecanicien"> 
                      <xsl:attribute name="numeca"> 
                         <xsl:value-of select="./@numeca" /> 
                      </xsl:attribute> 
                      <xsl:attribute name="nbh"> 
                         <xsl:value-of select="sum(//mec_rep[@numeca=current()/@numeca]/@nbh)" /> 
                      </xsl:attribute> 
                   </xsl:element> 
                </xsl:if> 
     
             </xsl:for-each> 
          </xsl:variable> 
     
          <xsl:for-each select="$meca_nbh/mecanicien"> 
             <xsl:sort select="nbh" data-type="number" order="descending" /> 
          </xsl:for-each> 
       </xsl:template> 
     
    </xsl:stylesheet>

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Points : 24
    Points
    24
    Par défaut
    Bon ce pb n'est plus récent mais comme c'est un classique, il sera peut être utile d'y repondre

    le problème n'est pas dans un algo complexe xslt mais dans le xpath du tri

    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:template match="/">
    		<html>
    			<head>
    				<title/>
    			</head>
    			<body>
    				<xsl:for-each select="*/mecanicien">
    					<xsl:sort order="descending" select="sum(../mec_rep[(@numeca=current()/@numeca) and (@numo=../reparation[number(concat(substring(@date_entree, 7, 4),substring(@date_entree, 4, 2),substring(@date_entree, 1, 2))) &lt;= 20070712 and( number(concat(substring(@date_sortie, 7, 4),substring(@date_sortie, 4, 2),substring(@date_sortie, 1, 2))) &gt;= 20070710 or not(@date_sortie))]/@numo)]/@nbh)"/>
    					<xsl:if test="position()=1">
    						<xsl:value-of select="concat(@nom,' ',@prenom)"/>
    						<br/>
     
    				nombre d'heure: <xsl:value-of select="sum(../mec_rep[(@numeca=current()/@numeca) and (@numo=../reparation[number(concat(substring(@date_entree, 7, 4),substring(@date_entree, 4, 2),substring(@date_entree, 1, 2))) &lt;= 20070712 and( number(concat(substring(@date_sortie, 7, 4),substring(@date_sortie, 4, 2),substring(@date_sortie, 1, 2))) &gt;= 20070710 or not(@date_sortie))]/@numo)]/@nbh)"/>
    					</xsl:if>
     
     
     
    				</xsl:for-each>
    			</body>
    		</html>
    	</xsl:template>
    </xsl:stylesheet>

  7. #7
    Membre éprouvé
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Points : 1 063
    Points
    1 063
    Par défaut
    merci de cette réponse

Discussions similaires

  1. requête pour avoir min/max par intervales
    Par MASSAKA dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2010, 18h41
  2. Débutant Requête pour récupéré plusieurs Max
    Par Missy33 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 18/09/2008, 10h59
  3. requete pour recuperer un max sous oracle
    Par donny dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/11/2007, 09h35
  4. Réponses: 1
    Dernier message: 06/12/2006, 15h24
  5. [MySQL] [débutant] probleme pour recuperer ID max et ID min
    Par fabien14 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/09/2006, 10h48

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