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 :

[XPATH] ou [XSL] Arret au premier noeud


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 39
    Points : 29
    Points
    29
    Par défaut [XPATH] ou [XSL] Arret au premier noeud
    Bonjour,

    J'ai un fichier volumineux (avec une structure assez simple) à transformer via XSLT.

    La transformation doit parser de nombreuse fois ce fichier qui ne contient que des éléments uniques.

    Je ne sais pas comment faire une requete qui s'arrête dès le premier noeud trouvé. Le parser ne doit pas passer aux éléments suivants. L'objectif est la rapidité du traitement.

    Merci par avance

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    On manque de detail
    au premier abord je te dirais de regarder du coté de position()

    recuperant le premier noeud truc mais je pense que ton problème est plus complexe (mais insuffisamment expliqué )

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Merci pour ta réponse

    Je souhaite effectivement obtenir qu'un seul noeud. J'utilisé la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /chemin/noeud[Test1 and test2 ... ][1]
    Avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /chemin/noeud[position()=1 and Test1 and test2 ... ]
    cela fonctionne aussi.

    La ligne que je cherche est la 3eme sur 30000. La requete que j'applique ne peux me donner qu'une seule réponse (Chaque ligne est unique)

    Dans les deux cas, pour avoir la réponse je dois attendre la fin du fichier de donnée (7mo) pour obtenir la réponse meme si c'est le 3eme noeud du fichier. J'ai donc des perfs très moyennes.

    J'aimerai que la transformation (JAXP1.3) arrête sa recherche dès que trouve le prmier noeud (position()=1).

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    bonjour,

    attention, avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /chemin/noeud[Test1 and test2 ... ][1]
    Le parcours du XML sera forcément séquentiel. Le moteur XPath va d'abord définir une liste de tous les noeuds qui satisfont le premier prédicat (Test1 and test2), puis renvoyer le premier noeud de cette liste.

    Sans plus de renseignements sur ton schema XML, il sera difficile de t'orienter vers des conseils d'optimisation...

  5. #5
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    En fait je ne veux pas que cela soit séquentiel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <racine>
      <a>
        <ligne>
          <col1/>
          <col2/>
          <col3/>
          <col4/>
        </ligne>
        <ligne> ....  </ligne>
        <ligne> ....  </ligne>
        ........
      </a>
        ....
    </racine>
    requete de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /racine/a/ligne[col1='...' and col2='...' and col3='...']
    J'ai environ 30000 tag ligne. Je requete sur col1, col2, col3 pour obtenir col4. Chaque ligne est unique (export d'une base de données)

    Je souhaite que le parseur stoppe son traitement dès que l'enreg (qui est unique) est trouvé.

    Suis je assez précis ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    En fait [1] ou position()=1 donnent les memes temps de traitement.

    Mais, les temps sont identiques si je doit chercher la première ou la dernière ligne, avec ou sans [1] !

    Comment faire ?

  7. #7
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Pour préciser ma précédente réponse, XPath est toujours séquentiel et exhaustif ; il parcourera tous les noeuds spécifiés par le chemin donné.

    De la façon qu'est constitué ton XML, il est donc impossible d'optimiser le temps de recherche. Pour accélerer, il faudrait restreindre au maximumet le plus tôt possible le nombre de branches de l'arbre à parcourir.

    Une possibilité, qui nécessite de refondre ton schéma, serait de regrouper les col1 de même valeur, puis les col2, etc. Ca donnerait ça :
    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
    <racine>
      <a>
        <col1>
          <valeur>aaa</valeur>
          <col2>
            <valeur>111</valeur> 
            <col3>
              <valeur>YYY</valeur>
              <col4>v1</col4>
              <col4>v2</col4>
              <col4>v3</col4>
              ...
            </col3>
            ...
          </col2>
          <col2>
            <valeur>222</valeur> 
            ...
          </col2>
          ...
        </col1>
        <col1>
          <valeur>bbb</valeur>
          ...
        </col1>
        ...
      </a>
    </racine>
    La requête devient alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /racine/a/col1[valeur='aaa']/col2[valeur='111']/col3[valeur='YYY']/col4[1]
    Evidemment, cela ne sera valable que si tes données peuvent se regrouper efficacement

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    En fait ce qui fait la différence c'est le nombre d'itération de recherche à faire dans cet arbre.
    J'ai en effet un traitement que va appeler de très nombreuses fois le template de recherche dans cet arbre pour obtenir une valeur avec des paramètres différents.

    J'ai fait des mesures, pour 50 itérations avec une recherche dans une branche de 32000 éléments. 1 seul élément parmi les 32000 match ma requête.


    • élément en début de branche
      - Arret sur le premier élément - 6.8s
      - Pas d'arret 45s
      élément en fin de branche
      - Arret sur le premier élément - 43s
      - Pas d'arret 44s


    Merci encore pour ta réponse.

  9. #9
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par laurenzo
    J'ai en effet un traitement que va appeler de très nombreuses fois le template de recherche dans cet arbre pour obtenir une valeur avec des paramètres différents.
    Il y a peut-être une possibilité d'optimisation de ce côté, l'appel de ce template peut peut-être être remplacé avantageusement par du code "inline". Peux-tu poster le code de ce template ?

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    c'est quoi du code inline ?

    Voici un résumé extrait de la transformation en question :
    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    	<!-- -->
    	<xsl:template match="/">
    		<Resultat>
    			<xsl:apply-templates/>
    		</Resultat>
    	</xsl:template>
    	<!-- -->
    	<xsl:template match="/FlatFiles/commandes">
    		<!--	traitement amont de mise en forme et permettant d'obtenir un noeud avec la query-->
    		<xsl:call-template name="Articles">
    			<xsl:with-param name="contexte" select="./noeudQuery"/>
    		</xsl:call-template>
    		<!--	traitement de fin de mise en forme -->
    	</xsl:template>
    	<!-- -->
    	<xsl:template name="Articles">
    		<xsl:param name="contexte"/>
    		<xsl:value-of select="/FlatFiles/Articles/Row[(Id_Budget='$contexte/Id_Budget') and . . . ][1]/Libelle"/>
    	</xsl:template>
    	<xsl:template match="text()"/>
    </xsl:stylesheet>

    /FlatFiles/commandes ~ < 10000
    /FlatFiles/Articles/Row ~ > 32000

    Comme dit dans mon post précédent, le fait de mettre [1] me permet d'avoir des temps de traitements beaucoup plus acceptable.

    Pour rappel je dois utiliser JAXP1.3-RI1.3.

  11. #11
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Par code inline je veux dire supprimer la fonction et placer le code qu'elle contenait partout où elle était appelée. Cela évite les temps de traitements supplémentaires dûs à l'enregistrement de contexte, construction des variables, etc.

    Pour ton code ça donnerait :
    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
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
       <xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/> 
       <!-- --> 
       <xsl:template match="/"> 
          <Resultat> 
             <xsl:apply-templates/> 
          </Resultat> 
       </xsl:template> 
       <!-- --> 
       <xsl:template match="/FlatFiles/commandes"> 
          <!--   traitement amont de mise en forme et permettant d'obtenir un noeud avec la query--> 
          <xsl:value-of select="/FlatFiles/Articles/Row[(Id_Budget=current()/noeudQuery/Id_Budget) and . . . ][1]/Libelle"/> 
          <!--   traitement de fin de mise en forme --> 
       </xsl:template> 
       <!-- --> 
       <xsl:template match="text()"/> 
    </xsl:stylesheet>

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Merci pour tout

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/03/2007, 18h39
  2. Réponses: 4
    Dernier message: 01/06/2006, 14h58
  3. [C#][VS2005]afficher le premier Noeud d'un TreeView
    Par tchup dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/05/2006, 12h01
  4. [XSL] savoir si le noeud courant est root
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 08/11/2005, 16h18
  5. [XSL][Noob]Compter des noeuds de meme valeur??
    Par Devil666 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/07/2005, 10h07

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