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 :

Fonction de recherche xsl/xml ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut Fonction de recherche xsl/xml ?
    Bonjour,

    je débute totalement en code xml/xsl et j'ai besoin d'extraire des données issues d'un fichier XML.
    Plus précisément, je suis parvenu à extraire certaines données comme ci dessous une liste de Hosts (ID, name,@...).
    Mais, à présent, j'ai besoin de rechercher dans le même fichier une donnée liée à une référence et d'en sortir une donnée associée.

    Voici un exemple de mon code XML, XSL et le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [XML CODE]
     <Host id="id147154X3289" name="193.168.83.227_TEST" comment="" ro="False">
        <Interface id="id147156X3289" bridgeport="False" dyn="False" label="" security_level="0" unnum="False" unprotected="False" name="eth0" comment="" ro="False">
         <IPv4 id="id147157X3289" name="193.168.83.227_TEST:eth0:ip" comment="" ro="False" address="193.168.83.227" netmask="255.255.255.224"/>
        </Interface>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [XSL CODE]
      <xsl:for-each select="FWObjectDatabase/Library/ObjectGroup/ObjectGroup/Host">
    		<xsl:value-of select="@id"/><xsl:text>|</xsl:text>	
    		<xsl:value-of select="@name"/><xsl:value-of select="$separateur"/>
    		<xsl:value-of select="Interface/IPv4/@address"/><xsl:value-of select="$separateur"/>
    		<xsl:value-of select="Interface/IPv4/@netmask"/>
    		<xsl:value-of select="$newline"/>
    	</xsl:for-each>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [RESULT]
    host_name1;host_ip;host_netmask
    host_name2;host_ip;host_netmask
    ...
    Je souhaite ajouter sur chaque ligne de résultat un nom de groupe qu'il faut aller chercher dans une autre balise.
    Le groupe contient une liste d'object.
    Je dois rechercher la même référence de l'objet Hosts (ID=id147154X3289(variable)) contenu dans une balise GROUP "ObjectRef ref=(variable)" et d'en extraire
    le nom de groupe associé "NAME_GROUPE_xxx" (variable)
    Voici une partie du code XML de la section GROUP contenant cette information:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [XML CODE]
          <ObjectGroup id="stdidxxxx" name="Groups" comment="" ro="False">
            <ObjectGroup id="id154198X31777" name="NAME_GROUPE_1" comment="" ro="False">
              <ObjectRef ref="id154181X31777"/>
            </ObjectGroup>
            <ObjectGroup id="id141136X21781" name="NAME_GROUPE_2" comment="" ro="False">
              <ObjectRef ref="id147156X3289"/>
              <ObjectRef ref="id141142X21781"/>
            </ObjectGroup>
          </ObjectGroup>
          <ObjectGroup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [RESULT]
    host_name;host_ip;host_netmask;host_group
    Merci d'avance pour votre aide sur ce sujet.

    Cdt

    Breizho

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Hello :

    - aller chercher les <ObjectRef> où qu'ils soient : - ne prendre que celui qui a la bonne référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //ObjectRef[@ref = 'id147154X3289']
    - remonter au parent de cet <ObjectRef> (son parent c'est <ObjectGroup>) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //ObjectRef[@ref = 'id147154X3289']/..
    - récupérer le nom de ce <ObjectGroup> :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //ObjectRef[@ref = 'id147154X3289']/../@name
    C'est bon jusque-là ?
    (Note : ce n'est pas la seule manière de faire. On peut aussi envisager //ObjectGroup[ObjectRef[@ref = 'id147154X3289']]/@name, mais un prédicat dans un prédicat, il y en a qui ont mal à suivre.)


    Il reste un problème : là la référence id147154X3289 je l'ai citée comme constante, mais comment faire pour reprendre l'id du <Host> en cours ?
    Jusqu'ici tu faisais simplement @id mais tu dois te douter que là ça n'ira pas, car ça ressemble beaucoup au @ref, qui n'est pas un attribut de <Host> mais de <ObjectRef>. Donc quelque part on voit bien que ça n'irait pas chercher l'id au bon endroit.

    Une solution est d'utiliser current() :
    qui va donc chercher l'attribut id du nœud en cours, le <Host> sélectionné dans le for-each.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour ce retour.
    Je comprend la démarche mais je ne parviens pas à coder.

    Voici ce que j'ai compris mais qui ne fonctionne pas (désolé je débute).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      <xsl:for-each select="FWObjectDatabase/Library/ObjectGroup/ObjectGroup/Host">
    		<xsl:value-of select="@id"/><xsl:text>|</xsl:text>	
    		<xsl:value-of select="@name"/><xsl:value-of select="$separateur"/>
    		<xsl:value-of select="Interface/IPv4/@address"/><xsl:value-of select="$separateur"/>
    		<xsl:value-of select="Interface/IPv4/@netmask"/>
    			<xsl:for-each select="ObjectRef .">
    				<xsl:value-of select="ObjectRef[@ref = current()/@id]/../@name ."><xsl:text>|</xsl:text>
    			</xsl:for-each>
    		<xsl:value-of select="$newline"/>
    	</xsl:for-each>
    Ce serait qq chose comme cela ?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Ok, alors trois choses :

    - Euh... c'est quoi cet 'espace point', où est-ce que je t'ai dit de mettre un espace puis un point.... Oh ! Euh, je vois ce qui se passe. J'ai modifié mon message du dessus. Efface-moi tous ces 'espace point' et recommence avec ça.

    - Si je ne me trompe pas, tu ne veux chercher qu'un seul nom de groupe pour chaque Host, n'est-ce pas ? Il n'y a donc aucune raison de faire un for-each. Un for-each, c'est quand on veut plusieurs machins, pas quand on en veut un.

    - Il me semble que tout ce que je t'ai montré commence par //
    Mais je ne vois pas de // dans ton code.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Oui, un seul nom de groupe pour chaque Host.

    Je te remercie beaucoup Thelvin. Cela fonctionne à présent et je commence à comprendre.

    Ta réponse m'a été très efficace.
    J'aurai certainement d'autres questions ultérieurement car je vais compliquer un peu les choses :-).

    Merci à toi.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Re-Bonjour,

    mon besoin évolue, à présent, je souhaite récupérer et mettre en variable une chaine de caractère "#xxxx" localisée dans un fichier xml entre des balises comme ci dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               <NATRuleOptions>
                  <Option name="color">#C08B5A</Option>
                </NATRuleOptions>
    Le code ci dessous m'affiche bien "color" mais j'ai besoin d'afficher la variable qui serait dans cet exemple: #C08B5A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		<xsl:for-each select="NATRuleOptions/Option">
    			<xsl:variable name="color" select="@name"/>
    			<xsl:value-of select="$color"/>
    		</xsl:for-each>
    Merci d'avance pour votre aide.

    Cdt

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Il suffit de prendre la valeur de current() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="current()"/>
    Les attributs de la balise ne t'intéressent pas...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Cela fonctionne en effet ! Merci beaucoup !

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    je cherche à présent à supprimer tout caractère de type "espace" qui serait présent dans une variable (puis éventuellement à le replacer par un caractère comme "_").

    Par exemple, dans le code ci dessous, je cherche à supprimer tout espace retourner par le résultat de la commande "value-of select", qu'elle serait la commande pour faire cela ? (éventuellement à remplacer par un "_") ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:for-each select="Srv/ServiceRef">
    <xsl:variable name="refService" select="@ref"/>
    <!-- RefService:<xsl:value-of select="$refService"/><xsl:value-of select="$separateur2"/> -->
    <xsl:value-of select="//*[@id = $refService]/@name"/><xsl:value-of select="$separateur2"/>
    <!-- dst_range_start:<xsl:value-of select="//*[@id = $refService]/@dst_range_start"/><xsl:value-of select="$separateur2"/> -->
    <!-- dst_range_end:<xsl:value-of select="//*[@id = $refService]/@dst_range_end"/><xsl:value-of select="$separateur2"/> -->
    </xsl:for-each>
    Merci d'avance pour votre aide.

    Cdt

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    La fonction translate() peut enlever des caractères donnés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    translate($maVariable, ' ', '');
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Ce langage reste assez puissant tout de même !

    Merci Thelvin.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    dans une précédente question, je cherchais à afficher une donné avec la commande "current".
    Ci dessous, je cherche à afficher la variable #C0C0C0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <PolicyRuleOptions>
                  <Option name="color">#C0C0C0</Option>
                  <Option name="stateless">False</Option>
    </PolicyRuleOptions>
    Mon code xsl ci dessous me renvoi #C0C0C0False, je ne sais pas comment filtrer uniquement sur "color" (j'ai essayé plusieurs syntaxe derrière current...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:for-each select="PolicyRuleOptions/Option">
    	<xsl:variable name="color" select="@name"/>
    	<xsl:value-of select="current()"/>
    </xsl:for-each>
    Merci.

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    ..... $color ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Désolé de faire mon boulet :-)

    Mais je ne vois pas la syntaxe, j'ai testé ceci sans succès:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <xsl:for-each select="PolicyRuleOptions/Option">
    <xsl:variable name="color" select="@name"/>
    <xsl:value-of select="[@name=current()/$color]"/>
    </xsl:for-each>
    je ne comprend pas encore bien l'écriture.

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Arf, non,
    Le code suivant me renvoie toujours: #C0C0C0False
    Alors que je ne souhaite que: #C0C0C0
    Il ne match pas que sur name="color", il match aussi sur name="stateless"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:for-each select="PolicyRuleOptions/Option">
    <xsl:variable name="color" select="current()"/>
    <xsl:value-of select="$color"/>
    </xsl:for-each>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <PolicyRuleOptions>
                  <Option name="color">#C0C0C0</Option>
                  <Option name="stateless">False</Option>
    </PolicyRuleOptions>

  17. #17
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Ah oui pardon. Enfin, pardon j'avais mal lu.

    Le résultat que tu obtiens est color et non pas #C0C0C0False. Ce dernier est obtenu si tu changes d'autres trucs que ce qu'on a dit. Forcément si tu changes sans arrêt plusieurs choses à la foi, tu ne comprendras pas les résultats.


    Mais bref, donc oui, j'avais mal lu.
    Tu n'as pas besoin d'une variable en fait. Tu n'as pas non plus besoin de current(). Tu n'as pas non plus besoin de for-each.

    Tu veux sélectionner une Option. Ça se fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select="PolicyRuleOptions/Option"

    Mais tu ne veux que celle qui répond à une certaine condition. Ça se fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select="PolicyRuleOptions/Option[ taCondition ]"
    La condition est que son attribut name soit "color", ça se fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select="PolicyRuleOptions/Option[@name = 'color']"
    Pas de for-each. Pas de variable. Pas de current(). On va juste chercher ce qu'on veut, point barre.

    for-each et variable interviennent quand on veut faire des traitements, pas quand on veut aller chercher.
    Et current() n'est utile que quand on veut retrouver le nœud en cours dans un prédicat. Ce qui n'est pas ton cas, tu ne t'intéresses qu'au nœud <Option>, qui est déjà celui visé par le prédicat.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Futur Membre du Club
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup Thelvin, c'est très clair !

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/04/2013, 10h24
  2. [String] Fonction de recherche de caractères numériques
    Par david71 dans le forum Général Java
    Réponses: 10
    Dernier message: 16/02/2005, 13h05
  3. XML -> XSL <- XML
    Par Punky65250 dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 16/09/2004, 10h29
  4. [xsl][XML] création d'un index
    Par Boosters dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 28/11/2002, 09h29
  5. xml -> xsl -> xml
    Par virgile04 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/10/2002, 17h53

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