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 :

[Débutant][XSLT] Gérer des tags XML identiques


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [Débutant][XSLT] Gérer des tags XML identiques
    Bonjour,

    Je débute en XSL et voici mon problème:

    Le fichier XML à transformer contient des éléments identiques:
    Example:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <string> 12.3.4.5 </string>
    <string> 8f </string>
    <string> 23.5.4.2 </string>
    <string> 2e </string>
    Pour le moment , mon xsl ressemble à ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:for-each select="/string">
    <xsl:apply-templates/>
    </xsl:for-each>
    Ce code parse tous les éléments <string> . Mon problème est que certains éléments <string> sont en hexadécimal et doivent être convertis en décimal.

    Ma question est donc, comment puis-je considérer les éléments un à un dans mon XSL, lorsqu'ils sont identiques dans le XML ?

    Merci!

    Michel

  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
    globalement tu ne veux que les balises string qui comporte des points
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <xsl:template match="/">
    <xsl:for-each select="/string">
    <xsl:apply-templates/>
    </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="string"/>
     
    <xsl:template match="string[contains(.,'.')]">
    </tutu>gagné<tutu>
    </xsl:template>

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci de la réponse,

    Cependant ce n'est pas tout a fait ce que je recherche.
    En effet je dois inclure tous les champs dans le fichier de sortie (CSV).

    C'est un fichier réseau, se trouvent des IP, ports, hostname etc. Tout compris entre des balises <(/)string>.

    Matcher des "." ne marchera donc pas pour distinguer des entrées.

    La seule solution possible serait de pouvoir convertir, dans une suite de <string>,
    le deuxieme et le quatrième.

    Du 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
    <xsl:template match="/">
    <xsl:for-each select="map">
    [META]int i = 0;
    <xsl:for-each select="/string">
    <xsl:apply-templates [META]$var=i />
    [META] i ++;
    </xsl:for-each>
    [META] i=0;
    </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="string" [META]$var>
    [META] if ($var == 1 || $var ==3) [[Conversion]]
    [META] else [[Valeur brute]]
    </xsl:template>
    Est compréhensible ??

    Enfin je vais chercher de mon côté aussi !

    Michel

  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
    peux tu nous fournir un fichier d'exemple xml relativement cours et un fichier de sortie que tu souhaites obtenir
    on va regarder

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Merci de ton aide

    Voici un example de 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <root>
     <map>
                   <count>66</count>
                   <creationTime>1188897819321</creationTime>
                   <lastSeenTime>1188910775244</lastSeenTime>
                   <values>
                      <list>
                         <string>10.12.13.17</string>
                         <string>89</string>
                         <string>10.0.13.123</string>
                         <string>89</string>
                         <string>aclins</string>
                         <string>Deny udp</string>
                         <string>UDP</string>
                      </list>
                   </values>
                </map>
                <map>
                   <count>95</count>
                   <creationTime>1188897824350</creationTime>
                   <lastSeenTime>1188916664778</lastSeenTime>
                   <values>
                      <list>
                         <string>10.28.16.12</string>
                         <string>89</string>
                         <string>10.0.13.123</string>
                         <string>89</string>
                         <string>aclins</string>
                         <string>Deny udp</string>
                         <string>UDP</string>
                      </list>
                   </values>
                </map>
                <map>
                   <count>1</count>
                   <creationTime>1188897829363</creationTime>
                   <lastSeenTime>1188897829363</lastSeenTime>
                   <values>
                      <list>
                         <string>192.168.1.124</string>
                         <null/>
                         <string>192.168.1.129</string>
                         <null/>
                         <string>drop</string>
                         <string>ICMP</string>
                      </list>
                   </values>
                </map>
    </root>
    Je voudrais le transformer en CSV du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    source,portSource,destination,portDest,Message,Nom,Protocole
    source,portSource,destination,portDest,Message,Nom,Protocole
    Les problèmes:

    - Les ports sont en Hexa dans le XML et il me les faut en Decimal. J'ai donc besoin de transofrmer le 2 eme et 4 eme <string>
    - Je dois mettre un champs vide quand je rencontre la balise </NULL>


    Mon XSL du moment qui ne marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
    <xsl:template match="/">Attacker,Port,Target,Port,Message,Name,Transport Protocol
    <xsl:for-each select="root/map">
    <xsl:for-each select="values/list/string">
    <xsl:apply-templates/>, </xsl:for-each>
    <xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
    </xsl:template>
    ...
    VOila

    MIchel

  6. #6
    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
    Citation Envoyé par Michel_be Voir le message

    - Les ports sont en Hexa dans le XML et il me les faut en Decimal. J'ai donc besoin de transofrmer le 2 eme et 4 eme <string>
    Si ce sont toujours les mêmes, tu peux utiliser la position() pour les identifier

  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
    oui tu as intêret d'utiliser la fonction position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <xsl:template match="list">
    <xsl:value-of select="./string[1]"/><xsl:text>,</xsl:text>
    <xsl:value-of select="./string[2]"/><xsl:text>,</xsl:text>
    <xsl:value-of select="./string[3]"/><xsl:text>,</xsl:text>
    <xsl:value-of select="./string[4]"/><xsl:text>,</xsl:text>
    <xsl:value-of select="./string[5]"/><xsl:text>,</xsl:text>
    </xsl:template>
    ou plus jolie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <xsl:template match="list">
    <xsl:for-each select="./string">
        <xsl:value-of select="."/>
        <xsl:if test="position(.) != last()">
             <xsl:text>,</xsl:text>
        </xsl:if>
    </xsl:for-each>
    </xsl:template>

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Merci)
    VOila j'ai terminé ..

    Merci de vos conseils

    Voici le code final, utilisant une librairie OpenSource pour la conversion hexa->decimal

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    <xsl:template match="/">Src,Port,Dst,Port,Message,Name,Transport Protocol
    <xsl:for-each select="archive/list/map">
    	<xsl:for-each select="values/list">
    		<xsl:apply-templates select="string | null"/>
    	</xsl:for-each>
    	<xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
    </xsl:template>
     
    <xsl:template match="string">
    	<xsl:variable name="position" select="position()"></xsl:variable>
    	<xsl:choose>
    		<xsl:when test="$position=2 or $position=4">
    		<xsl:call-template name='math:cvt-hex-decimal'>
               		<xsl:with-param name='value' select="."/>
    		</xsl:call-template>,</xsl:when>
    		<xsl:otherwise>
    		<xsl:value-of select="."/>,</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
     
    <xsl:template match="null">
    <xsl:text>,</xsl:text></xsl:template>
     
    <xsl:template name="math:cvt-hex-decimal">
        <xsl:param name="value"/>
     
        <xsl:choose>
          <xsl:when test='$value = ""'/>
     
          <xsl:when test='string-length($value) = 1'>
            <xsl:call-template name='math:cvt-hex-decimal-digit'>
              <xsl:with-param name='digit' select='$value'/>
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:variable name='last-digit'>
              <xsl:call-template name='math:cvt-hex-decimal-digit'>
                <xsl:with-param name='digit' select='substring($value,string-length($value),1)'/>
              </xsl:call-template>
            </xsl:variable>
            <xsl:variable name='remainder'>
              <xsl:call-template name='math:cvt-hex-decimal'>
                <xsl:with-param name='value' select='substring($value,1,string-length($value)-1)'/>
              </xsl:call-template>
            </xsl:variable>
     
            <xsl:value-of select='$last-digit + $remainder * 16'/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:template>
     
      <xsl:template name='math:cvt-hex-decimal-digit'>
        <xsl:param name='digit' select='0'/>
        <xsl:choose>
          <xsl:when test='$digit &lt;= 9'>
            <xsl:value-of select='$digit'/>
          </xsl:when>
          <xsl:when test='$digit = "a" or $digit = "A"'>10</xsl:when>
          <xsl:when test='$digit = "b" or $digit = "B"'>11</xsl:when>
          <xsl:when test='$digit = "c" or $digit = "C"'>12</xsl:when>
          <xsl:when test='$digit = "d" or $digit = "D"'>13</xsl:when>
          <xsl:when test='$digit = "e" or $digit = "E"'>14</xsl:when>
          <xsl:when test='$digit = "f" or $digit = "F"'>15</xsl:when>
        </xsl:choose>
      </xsl:template>
    A+

    Michel

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

Discussions similaires

  1. [XSLT] Générer des fichiers XML avec PHP
    Par oneTime dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 28/04/2008, 21h27
  2. Syntaxe des tags XML
    Par Nixar dans le forum ASP.NET
    Réponses: 4
    Dernier message: 12/03/2008, 16h26
  3. [XSLT]GROUPER des tags
    Par marxan dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 03/12/2007, 13h22
  4. [débutante][XSLT] Afficher des attributs
    Par Lith6 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/11/2007, 23h30
  5. [XSLT] Affichage des balises xml en html via une xslt
    Par Eileen dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 20/04/2007, 15h53

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