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 :

XLST dynamique avec le contenu du XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut XLST dynamique avec le contenu du XML
    Bonjour,

    Je suis un petit nouveau dans le monde du XSLT mais j'aimerai savoir si il peut répondre à un de mes besoins. J'ai un fichier xml ressemblant à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <root>
    <template type="tracking" h1="xcoor" h2="ycoor" />
    <template type="quantif" h2="val" />
    <data id="1" type="tracking" xcoor="1" ycoor="2" foo="empty" />
    <data id="2" type="tracking"  xcoor="5" ycoor="4" />
    <data id="3" type="quantif"  val="12" bar="hello"/>
    </root>
    Donc le probleme réside dans le fait il faut formaté le fichier avec des valeurs contenu dans lui-même. J'aimerai obtenir un fichier comme celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id | type | xcoor | ycorr | val
    1 | tracking | 1 |  2 | [x] |
    2 | tracking | 5 |  4 | [x] |
    3 | quantif | [x] | [x] | 12 |
    Pour le moment j'ai reussi a parcourrir la liste des arguments d'un item:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:for-each select="root/template/@*">
    <xsl:value-of select="."/><br/>
    </xsl:for-each>
    Mais comment prendre cela en compte pour utilisé cette valeur dans un autre for-each?
    Merci d'avance pour toutes informations qui pourrai m'aider.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Attends une minute, quoi*? L'exemple a l'air pas mal, mais je comprends pas qu'est-ce qu'il faut aller chercher où pour faire quoi ?

    Qu'est-ce que c'est que ces histoires "d'utiliser une valeur dans un autre for-each" ?

  3. #3
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Développeur C++, j'ai du mal a appréhendé le XSLT, mais le but serai de stocker toutes les valeurs des paramètres de l'item template pour faire un for-each sur les paramètres des items data. Mais d’après ce que j'ai vue la variable ne sont pas des tableaux, est ce vrai?

    Je qd meme mon avancement :
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:template match="/">
        <html>
          <body>
            <table>
              <!-- Parcourt toutes les data -->
              <xsl:for-each select="root/data">
                <tr>
                  <td>
                    <xsl:value-of select ="@id"/>
                  </td>
                  <!-- Parcourt toutes les valeurs dans template -->
                  <xsl:for-each select="../template/@*">
                    <td>
                      <xsl:variable name="ident" select="." />
                      <xsl:value-of select ="@$ident"/>                   
                    </td>
                  </xsl:for-each>
                  <xsl:value-of select ="name()"/>
                </tr>
              </xsl:for-each>
            </table>
          </body>
        </html>
      </xsl:template>
    </xsl:stylesheet>
    La ligne rouge ne fonctionne pas...

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par themadmax Voir le message
    Développeur C++, j'ai du mal a appréhendé le XSLT, mais le but serai de stocker toutes les valeurs des paramètres de l'item template pour faire un for-each sur les paramètres des items data.
    Je comprends pas ton exemple.
    - Les <template> contiennent des attributs type, les <data> aussi contiennent des attributs type.
    - Les <template> contiennent par exemple des attributs h1 ou h2 dont la valeur est par exemple xcoor ou ycoor ou val. Les <data>, eux, n'ont pas d'attribut h1 ou h2, mais ils ont des attributs xcoor ou ycoor ou val dont la valeur est quelconque.

    Tu vois bien que c'est pas la même chose, alors quoi ? C'est pourtant pas compliqué, comme question.

    Citation Envoyé par themadmax Voir le message
    Mais d’après ce que j'ai vue la variable ne sont pas des tableaux, est ce vrai?
    Pas vraiment. Il n'y a pas de "tableau" mais il y a des "ensembles de nœuds," un nœud pouvant être un élément XML, un nœud texte XML ou un attribut d'élément XML. Une simple string, par contre, n'est pas un nœud, donc on ne peut pas la mettre dans un ensemble de nœuds.

    Il serait, par contre, possible de construire un ensemble de nœuds qui contient tous les attributs de valeurs différentes qui t'intéressent, c'est pas évident mais ça se fait.
    Toutefois il faut commencer par comprendre ce que tu comptes faire. C'est pas important que tu connaisses pas XSLT. Oublie deux secondes que XSLT existe et explique quelle logique algorithmique tu pourrais mettre en œuvre.

  5. #5
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Donc je re-explique, je voudrais extraire de <data> seulement les paramètres correspondant a ceux de <template>. Et bien sur cela est variable. Par exemple si on trouve dans <template> h1="xcoor" alors si une <data> contient comme nom d'attribut xcoor on affiche sa valeur!
    Le tout pour générer un tableau comme poster dans mon premier message.

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    ... Mais enfin, ignore pas mes remarques, quoi...

    C'est attribut type, alors, c'est quoi, c'est particulier ? Pourquoi je dois poser la question ? Pourquoi je dois le faire 2 fois ?

  7. #7
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Citation Envoyé par thelvin Voir le message
    ... Mais enfin, ignore pas mes remarques, quoi...
    Je n'ignore pas tes remarques, mais j'ai du mal a voire comment être plus claire

    Citation Envoyé par thelvin Voir le message
    C'est attribut type, alors, c'est quoi, c'est particulier ? Pourquoi je dois poser la question ? Pourquoi je dois le faire 2 fois ?
    Ben il me semblai que cela coulé de source l'attribut type est commun au <template> et <data> et donc peut-être utilisé pour faire une correspondance.
    Bon je fais un petit schéma supplémentaire...

  8. #8
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    C'est faisable mais c'est pas du tout pratique avec la structure de ton XML.

    Le truc c'est de faire une variable intermédiaire qui réorganise tes éléments template en une structure exploitable par le XSL (noms d'éléments et d'attributs génériques) :
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <cols>
    	<col type="tracking" match="xcoor"/>
    	<col type="tracking" match="ycoor"/>
    	<col type="quantif" match="val"/>
    </cols>
    Cette structure étant créée de toute pièce dans une variable, il est nécessaire de faire appel à une fonction externe node-set de exslt.

    Ensuite il suffit d'appliquer un template à tous les data en passant en paramètre cette variable.
    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
    <xsl:stylesheet
    		id="stylesheet"
    		version="1.0"
    		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    		xmlns:exslt="http://exslt.org/common">
    	<xsl:template match="/">
    	<html>
    		<xsl:variable name="cols">
    			<xsl:apply-templates select="root/template"/>
    		</xsl:variable>
    		<table>
    			<tr>
    				<th>id</th>
    				<th>type</th>
    				<xsl:for-each select="exslt:node-set($cols)/col">
    					<th><xsl:value-of select="@match"/></th>
    				</xsl:for-each>
    			</tr>
    			<xsl:apply-templates select="root/data">
    				<xsl:with-param name="cols" select="$cols"/>
    			</xsl:apply-templates>
    		</table>
    	</html>
    	</xsl:template>
     
    	<xsl:template match="template">
    		<xsl:if test="@h1">
    			<col type="{@type}" match="{@h1}"/>
    		</xsl:if>
    		<xsl:if test="@h2">
    			<col type="{@type}" match="{@h2}"/>
    		</xsl:if>
    		<xsl:if test="@h3">
    			<col type="{@type}" match="{@h3}"/>
    		</xsl:if>
    	</xsl:template>
     
    	<xsl:template match="data">
    		<xsl:param name="cols"/>
    		<xsl:variable name="current" select="."/>
    		<tr>
    			<td><xsl:value-of select="@id"/></td>
    			<td><xsl:value-of select="@type"/></td>
    			<xsl:for-each select="exslt:node-set($cols)/col">
    				<xsl:variable name="match" select="@match"/>
    				<td>
    					<xsl:choose>
    						<xsl:when test="$current/@type = @type and $current[@*[name() = $match]]">
    							<xsl:value-of select="$current/@*[name()=$match]"/>
    						</xsl:when>
    						<xsl:otherwise>
    							<xsl:value-of select="'[x]'"/>
    						</xsl:otherwise>
    					</xsl:choose>
    				</td>
    			</xsl:for-each>
    		</tr>
    	</xsl:template>
    </xsl:stylesheet>
    Si tu peux modifier le XML, il serait préférable d'écrire directement tes templates sous une forme exploitable, donc pas des attributs avec des noms spéciaux (h1, h2, ...) ce qui n'est pas facilement gérable. De plus l'ordre dans lequel est écrit les éléments fait foi. Mais si tu veux absolument définir un ordre spécial visible dans le XML, tu peux ajouter un autre attribut générique genre "ordre" et faire un sort dessus dans le for-each.

  9. #9
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Merci Loceka pour cette réponse... je mon plonge dessus et reviens quand j'aurai compris tout ton exemple de code.

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par themadmax Voir le message
    Ben il me semblai que cela coulé de source l'attribut type est commun au <template> et <data> et donc peut-être utilisé pour faire une correspondance.
    Ben ça va tu manques pas d'air.
    Je croyais qu'on voulait la liste complète des attributs de <template> et maintenant c'est "la liste complète des attributs de <template> moins, évidemment, @type."
    Vu que de toute façon quand un <data> ne possède pas un attribut dans la liste, on est bien obligé de ne rien afficher, cette fameuse correspondance est inutile dans le domaine qui nous intéresse.

    Comme dit Loceka, c'est pas simple du tout.

    Une possibilité serait de faire une variable contenant l'ensemble des attributs de <template> à valeur distincte (et qui, évidemment, ne sont pas @type). Cela peut se faire avec une déduplication de type Muench, sauf que c'est des valeurs d'attribut qu'on essaie de dédupliquer.

    Donc une clé genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    match="template/@*[name() != 'type']" use="."
    et le nodeset contenant les attributs dédupliqués obtenu avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /root/template/@*[generate-id(.) = generate-id(key('nomdelaclef', .))]
    Quant à un moment où tu veux parcourir la liste des attributs possibles, tu n'as qu'à faire un for-each sur cette variable. Pour vérifier connaître la valeur de l'attribut en question sur ton <data>, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $currentData/@*[name() = current()]
    Cette même expression est booléenne si utilisée dans un if ou un when, et t'indique si le <data> a ou non un attribut de ce nom.

    Cela marchera quel que soit le nombre d'attributs contenus dans tes <template> et quels que soient leurs noms, du moment que c'est pas 'type'.

    L'exemple de Loceka me semble encore plus compliqué que nécessaire. (Et ne marche que pour @h1, @h2 et @h3, mais cela se généralise facilement.)

  11. #11
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    Citation Envoyé par thelvin Voir le message
    L'exemple de Loceka me semble encore plus compliqué que nécessaire. (Et ne marche que pour @h1, @h2 et @h3, mais cela se généralise facilement.)
    Ouaip

    Mais s'il change sa structure template comme je l'ai montré c'est tout de suite beaucoup plus simple. Plus besoin de mon premier template sur l'élément "template" où sont écris en dur les @h1, @h2, @h3, ... (ce qui est très très moche, j'avoue).

    Après comme tu dis c'est possible de l'éviter en rajoutant un template qui match tous les attributs de "template" sauf @type mais j'avais pas envie (pis j'y avais pas pensé surtout).

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    C'est un fait que le format XML de départ n'est pas super bien étudié, mais bon, là le but est justement de le transformer en quelque chose de plus exploitable.

    On n'y peut rien, c'est la bonne chose à faire et il faut bien la faire d'une manière ou d'une autre. Pourquoi pas XSLT.

  13. #13
    Membre habitué
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Points : 162
    Points
    162
    Par défaut HiHi, le bizut a une idée !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select ="@$ident"/>
    ne devrait pas s'écrire comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select ="@*[local-name()=$ident]"/>

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Tout à fait. D'ailleurs ça se voit dans nos codes.

    Je pense que name() est peut-être préférable à local-name() ici.
    Mais bon, ça dépend de questions de namespaces, et je préfère ne pas partir là-dedans vu le mal que j'ai à faire parler de la logique générale de la chose, sans se concentrer sur XML.

  15. #15
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Yes! un grand merci a tous même ceux que j'ai énervé. Donc comme me l'a mentionné Loceka, j'ai apporté une modification au fichier xml d'entré (j’espère que cela soit réalisable dans le réalité).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml-stylesheet type="text/xsl" href="sample.xsl"?>
    <root>
      <template type="tracking">
        <value type="tracking" match="xcoor" />
        <value type="tracking" match="ycoor" />
        <value type="quantif" match="val" />
      </template>
      <data id="1" type="tracking" xcoor="1" ycoor="2" foo="empty" />
      <data id="2" type="tracking"  xcoor="5" ycoor="4" />
      <data id="3" type="quantif"  val="12" bar="hello"/>
    </root>
    Puis voila vers mon xsl, je suis passé par une variable data, franchement sans trop maitriser mais sa fonctionne!
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
      <xsl:template match="/">
        <html>
          <body>
            <table border="1">
              <xsl:apply-templates select="/root/data" />           
            </table>
          </body>
        </html>
      </xsl:template>
     
     
      <xsl:template match="data">
        <tr>
          <td>
            <xsl:value-of select="@id"/>
          </td>
          <td>
            <xsl:value-of select="@type"/>
          </td>
          <xsl:variable name="data" select="@*" />
          <xsl:call-template name="DataItem">
            <xsl:with-param name="data" select="@*"/>
          </xsl:call-template>
        </tr>
      </xsl:template>
     
      <xsl:template name="DataItem">
        <xsl:param name="data"/>    
        <xsl:for-each select="/root/template/*">
          <xsl:variable name ="match" select="@match" />
          <td>
            <xsl:for-each select="$data[$match=name()]">
              <xsl:value-of select="."/>
            </xsl:for-each>
          </td>
        </xsl:for-each>
      </xsl:template>  
     
    </xsl:stylesheet>
    Tous les commentaires sont les bien venu si j'ai mal fait, ou si j'aurai pu mieux faire...

  16. #16
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Je trouve ça pas mal. Quelques remarques :

    - data n'a pas besoin d'être un paramètre. Une variable suffit. Le contexte de l'élément <data> est conservé, tu pouvais aussi bien faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="data" select="@*"/>
    - Il n'était pas nécessaire de passer par un template nommé... Mais bon, ça simplifie peut-être la lecture.

    - Il y a plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        <xsl:for-each select="/root/template/*">
          <xsl:variable name ="match" select="@match" />
          <td>
            <xsl:value-of select="$data[$match=name()]"/>
          </td>
        </xsl:for-each>
    - Il n'y a pas de déduplication sur les match. Si tu as un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <template>
        <value type="tracking" match="xcoor" />
        <value type="tracking" match="ycoor" />
        <value type="tracking" match="bruh" />
        <value type="quantif" match="val" />
        <value type="quantif" match="bruh" />
    </template>
    Tu afficheras deux fois l'attribut bruh. Pas oublier.

  17. #17
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Merci pour ces petites remarques.

    Pour ta remarque final, en effet j'ai découvert ce problème mais je pense pouvoir le modifier la génération du fichier XML, pour évité d'avoir de doublon.

  18. #18
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 843
    Points
    4 843
    Par défaut
    A quoi te sert ton attribut type de template vu que tu ne l'utilises nulle part ?

    Si tu ne t'en sers pas du tout, alors autant le virer. Sinon, pour gérer les "doublons" pour les attributs communs entre les différents, types tu peux les factoriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <template>
    	<value type="tracking quantif" match="bruh" />
    </template>
    Il te suffit alors d'utiliser un contains() au lieu d'un = pour la comparaison (que tu n'as pas faite d'ailleurs, je le rappelle).

    Sinon ça m'a l'air pas mal

    Le plus simple pour toi est en effet de modifier la structure du XML, le code XSL en sera grandement simplifié et plus rapide.

  19. #19
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par Loceka Voir le message
    Sinon, pour gérer les "doublons" pour les attributs communs entre les différents, types tu peux les factoriser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <template>
    	<value type="tracking quantif" match="bruh" />
    </template>
    Il te suffit alors d'utiliser un contains() au lieu d'un = pour la comparaison (que tu n'as pas faite d'ailleurs, je le rappelle).
    Moi je trouve ça pas terrible, les attributs en NMTOKENS. Les outils XML ne savent pas auto-gérer son parsing, et notamment XPath ne le peut pas. contains() est infiniment trop général pour ça, donc surtout pas. Seul un split sur les whitespaces et une vérification qu'un token est contenu dans les tokens générés par ce split, serait valable. Et sans EXSLT c'est trop compliqué, déjà qu'avec, c'est moyen.

    Quand on veut faire des trucs pareils, on s'en sort mieux avec une structure genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <template>
      <value match="bruh">
        <type name="tracking"/>
        <type name="quantif"/>
      </value>
    </template>
    Par contre c'est un peu moins lisible. C'est mieux pour le traitement automatisé mais moins bien pour la lecture humaine. C'est un choix à faire.

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

Discussions similaires

  1. Remplir un menu déroulant avec le contenu d'un XML
    Par ibson76 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/09/2008, 15h57
  2. Checker un doc XML chargé dynamiquement avec un DTD
    Par Mr Pink Eyes dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 29/07/2008, 23h11
  3. [XSLT] Création de fichier XML dynamique avec PHP
    Par daninho dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 02/02/2006, 11h18
  4. Contenu DataSource.xml avec base Mysql
    Par PrinceMaster77 dans le forum XMLRAD
    Réponses: 3
    Dernier message: 11/03/2004, 12h59

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